Для внутреннего соединения во всех столбцах вы также можете использовать fintersect
из data.table -пакет или intersect
из dplyr -пакета в качестве альтернатив merge
без указания by
-колонков. это даст строки, которые равны между двумя кадрами данных:
merge(df1, df2)
# V1 V2
# 1 B 2
# 2 C 3
dplyr::intersect(df1, df2)
# V1 V2
# 1 B 2
# 2 C 3
data.table::fintersect(setDT(df1), setDT(df2))
# V1 V2
# 1: B 2
# 2: C 3
Пример данных:
df1 <- data.frame(V1 = LETTERS[1:4], V2 = 1:4)
df2 <- data.frame(V1 = LETTERS[2:3], V2 = 2:3)
Вам нужно пройти в последовательности, но вы забыли запятую, чтобы сделать ваши параметры кортежем:
cursor.execute('INSERT INTO images VALUES(?)', (img,))
Без запятой (img)
- это просто сгруппированное выражение, а не кортеж, и, следовательно, строка img
рассматривается как входная последовательность. Если эта строка имеет длину 74 символа, тогда Python видит это как 74 отдельных значения привязки, каждый из которых длинный.
>>> len(img)
74
>>> len((img,))
1
Если вам становится легче читать, вы также можете использовать литерал списка:
cursor.execute('INSERT INTO images VALUES(?)', [img])
%
наstr
делает такую магию - он рассматривает кортеж как несколько значений, ноstr
(или любой другой тип итерации) как одно значение. Но это вызывает путаницу гораздо чаще, чем решает ее, поэтому почти ничто в stdlib не пытается использовать эту магию. – abarnert 16 January 2014 в 23:50