如何删除Pandas中两个数据帧中的常见行?

时间:2016-07-31 06:21:48

标签: python-2.7 pandas scikit-learn

我有两个数据框 - df1df2

df1 has row1,row2,row3,row4,row5
df2 has row2,row5

我希望有一个新的数据框df1-df2。也就是说,结果数据框的行应为 - row1,row3,row4

4 个答案:

答案 0 :(得分:6)

您可以使用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

答案 1 :(得分:4)

您可以使用=iferror(index(Sheet13!A$1:A$99, small(index(row($1:$99)+(Sheet13!$C$1:$C$99<>"no")*1E+99, 0, 0), row(1:1))), "") 功能

index.difference()

答案 2 :(得分:0)

对于此类问题,请参见“熊猫左联接”。

答案 3 :(得分:0)

这是最好的方法:

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']

请注意,使用重复复制来最小化比较。没有它们,它也可以工作。

为什么这是最好的方法?

最好的方法是比较行内容本身,而不是比较索引或一两列,并且相同的代码也可以用于其他过滤器(例如“ both”和“ right_only”),以达到相似的结果。

  1. index.difference仅适用于基于索引的唯一比较
  2. pandas.concat()drop_duplicated()结合使用并不理想,因为它还会摆脱可能仅在您要保留的数据帧中并出于有效原因而重复的行。