从两个数据流中提取唯一行

2024-10-03 23:24:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个大的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']})

Tags: 文件dataframevalueexcelpddf1df2c2
3条回答

例如,你可以。你知道吗

1)创建具有非重复项的遮罩(~反转选择)。感谢温对这个解决方案的评论,你的索引需要对齐。你知道吗

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)您可以将lambda函数作为2 passa的变体添加到loc。你知道吗

df = pd.concat([df1,df2]).loc[lambda x: ~x.duplicated(keep=False)]

在创建tuple之后使用symmetric_difference

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)}

这将根据它们合并的位置添加一列:

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

相关问题 更多 >