如何在 Pandas 中删除两个数据框中的公共行?
Posted
技术标签:
【中文标题】如何在 Pandas 中删除两个数据框中的公共行?【英文标题】:How to remove common rows in two dataframes in Pandas? 【发布时间】:2016-12-05 12:00:42 【问题描述】:我有两个数据框 - df1
和 df2
。
df1 has row1,row2,row3,row4,row5
df2 has row2,row5
我想要一个新的数据框,例如df1-df2
。也就是说,结果数据帧的行应该为 -row1,row3,row4
。
【问题讨论】:
【参考方案1】:这是最好的方法:
df = df1.drop_duplicates().merge(df2.drop_duplicates(), on=df2.columns.to_list(),
how='left', indicator=True)
df.loc[df._merge=='left_only',df.columns!='_merge']
请注意,drop duplicated 用于最小化比较。没有它们也可以。
为什么这是最好的方法?
最好的方法是比较行内容本身,而不是索引或一/两列,相同的代码也可以用于其他过滤器,如“both”和“right_only”,以获得类似的结果。
-
index.difference 仅适用于基于唯一索引的比较
pandas.concat()
加上 drop_duplicated()
并不理想,因为它还会删除可能仅在您想要保留的数据框中并出于正当理由而重复的行。
【讨论】:
【参考方案2】:对于此类问题,请参阅 pandas 中的 left join。
【讨论】:
首先是左join。其次你应该回答这个问题。这属于 cmets。 感谢您的反馈。我是新来的。【参考方案3】:你可以使用index.difference()
函数
import numpy as np
import pandas as pd
df1 = pd.DataFrame(np.random.randn(5, 2), index= ['row' + str(i) for i in range(1, 6)])
df1
0 1
row1 0.249451 -0.107651
row2 1.295390 -1.773707
row3 -0.893647 -0.683306
row4 -1.090551 0.016833
row5 0.864612 0.369138
df2 = pd.DataFrame(np.random.randn(2, 2), index= ['row' + str(i) for i in [2, 5]])
df2
0 1
row2 0.549396 -0.675574
row5 1.348785 0.942216
df1.loc[df1.index.difference(df2.index), ]
0 1
row1 0.249451 -0.107651
row3 -0.893647 -0.683306
row4 -1.090551 0.016833
【讨论】:
请注意,这里不比较两个数据帧的内容,它只是比较索引的值。【参考方案4】:您可以使用pandas.concat
按行连接两个数据帧,然后使用drop_duplicates
删除其中所有重复的行。
In [1]: import pandas as pd
df_1 = pd.DataFrame("A":["foo", "foo", "foo", "bar"], "B":[0,1,1,1], "C":["A","A","B","A"])
df_2 = pd.DataFrame("A":["foo", "bar", "foo", "bar"], "B":[1,0,1,0], "C":["A","B","A","B"])
In [2]: df = pd.concat([df_1, df_2])
In [3]: df
Out[3]:
A B C
0 foo 0 A
1 foo 1 A
2 foo 1 B
3 bar 1 A
0 foo 1 A
1 bar 0 B
2 foo 1 A
3 bar 0 B
In [4]: df.drop_duplicates(keep=False)
Out[4]:
A B C
0 foo 0 A
2 foo 1 B
3 bar 1 A
【讨论】:
以上是关于如何在 Pandas 中删除两个数据框中的公共行?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Pandas 的条件删除数据框中的某些行? [复制]
如果在另一个数据框中确实存在,则删除行 - python pandas