我有两个很大的excel文件,想提取每个文件中唯一的行。
例如,我有
df1 = pd.DataFrame({'Value': [100,50,20,10],
'C1': ['a','b','c','d'],
'C2': ['g','h','i','j'],})
df2 = pd.DataFrame({'Value': [100,40,20,5],
'C1': ['a','z','c','d'],
'C2': ['g','h','i','m'],})
第一行和第三行在df1和df2之间共享。 (a,g,100或c,i,20) df1和df2之间不共享第二行和第四行,我想提取这些行。 (b,h,50。d,j,10。z,h,40,和d,m,5)。
如果您能告诉我如何使用python做到这一点,我将非常感谢。
谢谢你们的反馈。 如果我能得到低于输出的结果,那应该很棒。
df1only=pd.DataFrame({'Value': [50,10],'C1': ['b','d'],'C2': ['h','j'],})
df2only = pd.DataFrame({'Value': [40,5],'C1': ['z','d'],'C2': ['h','m']})
答案 0 :(得分:2)
创建symmetric_difference
后使用tuple
set(df1.apply(tuple,1)).symmetric_difference(set(df2.apply(tuple,1)))
Out[653]: {('b', 'h', 50), ('d', 'j', 10), ('d', 'm', 5), ('z', 'h', 40)}
或者简单地
set(df1.apply(tuple,1))^set(df2.apply(tuple,1))
Out[654]: {('b', 'h', 50), ('d', 'j', 10), ('d', 'm', 5), ('z', 'h', 40)}
答案 1 :(得分:2)
例如,您可以。
1)创建一个没有重复的遮罩(〜反转选择)。感谢Wen对此解决方案的评论,您的索引需要对齐。
m = ~df1.isin(df2).all(1)
# Access dataframe with one of below
#df1[m]
#df2[m]
#pd.concat([df1,df2]).loc[m]
2)从连接的数据框中删除重复项(故障安全,假设您的值是3的集合)
df = pd.concat([df1,df2])
df.loc[~df.duplicated(keep=False)]
3)您可以作为2 passa的变体来查找lambda函数。
df = pd.concat([df1,df2]).loc[lambda x: ~x.duplicated(keep=False)]
答案 2 :(得分:1)
这将根据它们合并的位置进行过滤,从而添加一列:
merged = df1.merge(df2, indicator=True, how='outer')
final = merged[merged['_merge'] != 'both']
print(final)
这将对df1和df2进行右外部合并,并添加一列,指示发生合并的位置以及该行对于df是唯一的还是仅存在于其中一个:
>>> merged[merged['_merge'] != 'both']
C1 C2 Value _merge
1 b h 50 left_only
3 d j 10 left_only
4 z h 40 right_only
5 d m 5 right_only