У меня есть df1
и df2
:
df1 = pd.DataFrame([[1,1,1,1],[2,2,1,1],[0,0,1,1],[1,1,1,1],[2,2,1,1],[0,0,4,1]],
columns=['col1','col2','col3','col4'])
df2 = pd.DataFrame([[1,1,1,1],[3,3,1,1],[0,0,1,1],[1,1,5,1],[3,3,1,1],[0,0,1,1]],
columns=['col1','col2','col3','col4'])
Я удалил дублирующиеся строки:
df1 = df1.drop_duplicates(subset=['col1', 'col2', 'col3'])
df2 = df2.drop_duplicates(subset=['col1', 'col2', 'col3'])
, поэтому каждый df состоит из уникальных строк.Но есть некоторые совпадения между двумя dfs:
col1 col2 col3 col4
0 1 1 1 1
1 2 2 1 1
2 0 0 1 1
5 0 0 4 1
col1 col2 col3 col4
0 1 1 1 1
1 3 3 1 1
2 0 0 1 1
3 1 1 5 1
Мои фактические df1
и df2
имеют форму приблизительно (5000000, 23) и включают в себя поля int, float и object.
Начать редактирование: Я хочу создать df1_uniq
(что в df1, но не в df2) и df2_uniq
(что в df2, но не в df1.
df1_iniq:
col1 col2 col3 col4
1 2 2 1 1
5 0 0 4 1
df2_uniq:
col1 col2 col3 col4
1 3 3 1 1
3 1 1 5 1
Конец РЕДАКТИРОВАНИЯ
В нотации набора я думаю, что это будет df1.difference(df2)
и df2.difference(df1)
, но я получаю пустые наборы, когда запускаю этот код.Обратите внимание, что сравнение одного столбца в каждом df работает , например,
set(df_1[field].unique()).difference(set(df_2[field].unique()))
возвращает [2]
.
Другой подход будетциклически проходить через каждый df, и если df1 [i] равняется какой-либо строке в df2, то отбросить строку в обоих dfs, но это подход O (n ** 2), который займет много времени.
Есть ли более питонический, пандастический способ сделать это?