对 2 pandas 个数据帧进行异或运算
XOR operation on 2 pandas DataFrames
有没有办法从第一个 DataFrame 中删除所有可以在第二个 DataFrame 中找到的行,并添加仅在第二个 DataFrame 中独占的行(= XOR)?这里有一个转折点:第一个 DataFrame 有一个列在比较过程中应该被忽略。
import pandas as pd
df1 = pd.DataFrame({'col1': [1,2,3],
'col2': [4,5,6],
'spec': ['A','B','C']})
df2 = pd.DataFrame({'col1': [1,9],
'col2': [4,9]})
result = pd.DataFrame({'col1': [2,3,9],
'col2': [5,6,9],
'spec': ['B','C','df2']})
df1 = df1.astype(str)
df2 = df1.astype(str)
这类似于 UNION(不是 UNION ALL)操作。
合并
col1 col2 spec
0 1 4 A
1 2 5 B
2 3 6 C
和
col1 col2
0 1 4
1 9 9
至
col1 col2 spec
1 2 5 B
2 3 6 C
1 9 9 df2
您可以连接并删除重复项:
out = (pd.concat((df1, df2.assign(spec='df2')))
.drop_duplicates(subset=['col1','col2'], keep=False))
或者过滤掉常见的行并连接:
out = pd.concat((df1[~df1[['col1','col2']].isin(df2[['col1','col2']]).all(axis=1)],
df2[~df2.isin(df1[['col1','col2']]).all(axis=1)].assign(spec='df2')))
输出:
col1 col2 spec
1 2 5 B
2 3 6 C
1 9 9 df2
有没有办法从第一个 DataFrame 中删除所有可以在第二个 DataFrame 中找到的行,并添加仅在第二个 DataFrame 中独占的行(= XOR)?这里有一个转折点:第一个 DataFrame 有一个列在比较过程中应该被忽略。
import pandas as pd
df1 = pd.DataFrame({'col1': [1,2,3],
'col2': [4,5,6],
'spec': ['A','B','C']})
df2 = pd.DataFrame({'col1': [1,9],
'col2': [4,9]})
result = pd.DataFrame({'col1': [2,3,9],
'col2': [5,6,9],
'spec': ['B','C','df2']})
df1 = df1.astype(str)
df2 = df1.astype(str)
这类似于 UNION(不是 UNION ALL)操作。
合并
col1 col2 spec
0 1 4 A
1 2 5 B
2 3 6 C
和
col1 col2
0 1 4
1 9 9
至
col1 col2 spec
1 2 5 B
2 3 6 C
1 9 9 df2
您可以连接并删除重复项:
out = (pd.concat((df1, df2.assign(spec='df2')))
.drop_duplicates(subset=['col1','col2'], keep=False))
或者过滤掉常见的行并连接:
out = pd.concat((df1[~df1[['col1','col2']].isin(df2[['col1','col2']]).all(axis=1)],
df2[~df2.isin(df1[['col1','col2']]).all(axis=1)].assign(spec='df2')))
输出:
col1 col2 spec
1 2 5 B
2 3 6 C
1 9 9 df2