比较多个列以获取两个Pandas数据帧中不同的行

2024-05-16 06:12:56 发布

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

我有两个数据帧:

df1=
    A    B   C
0   A0   B0  C0
1   A1   B1  C1
2   A2   B2  C2

df2=
    A    B   C
0   A2   B2  C10
1   A1   B3  C11
2   A9   B4  C12

我想根据一列或两列(或多列)在df1中查找在df2中找不到的行。因此,如果我只比较列“A”,则在df2中找不到来自df1的以下行(请注意,列“B”和列“C”不用于df1和df2之间的比较)

    A    B   C
0   A0   B0  C0

我想返回一个系列

0   False
1   True
2   True

或者,如果我只比较列“A”和列“B”,则在df2中找不到来自df1的以下行(请注意,列“C”不用于df1和df2之间的比较)

    A    B   C
0   A0   B0  C0
1   A1   B1  C1

我想返回一个

0   False
1   False
2   True

我知道如何使用集合来实现这一点,但我正在寻找一种简单的熊猫方式来实现这一点。


Tags: 数据falsetruea2a1b0a0b2
3条回答
 ~df1['A'].isin(df2['A'])

应该给你买你想要的系列

df1[ ~df1['A'].isin(df2['A'])]

数据帧:

    A   B   C
0   A0  B0  C0

如果您的版本是0.17.0,那么您可以使用^{}并传递感兴趣的cols,how='left'并将indicator=True设置为值是只在left中存在还是同时存在。然后可以测试附加的_merge列是否等于“both”:

In [102]:
pd.merge(df1, df2, on='A',how='left', indicator=True)['_merge'] == 'both'

Out[102]:
0    False
1     True
2     True
Name: _merge, dtype: bool

In [103]:
pd.merge(df1, df2, on=['A', 'B'],how='left', indicator=True)['_merge'] == 'both'

Out[103]:
0    False
1    False
2     True
Name: _merge, dtype: bool

合并输出:

In [104]:
pd.merge(df1, df2, on='A',how='left', indicator=True)

Out[104]:
    A B_x C_x  B_y  C_y     _merge
0  A0  B0  C0  NaN  NaN  left_only
1  A1  B1  C1   B3  C11       both
2  A2  B2  C2   B2  C10       both

In [105]:    
pd.merge(df1, df2, on=['A', 'B'],how='left', indicator=True)

Out[105]:
    A   B C_x  C_y     _merge
0  A0  B0  C0  NaN  left_only
1  A1  B1  C1  NaN  left_only
2  A2  B2  C2  C10       both

理想情况下,可以只使用~df1[COLS].isin(df2[COLS])作为掩码,但这需要索引标签匹配(https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.isin.html

下面是一个简洁的表单,它使用.isin,但将第二个数据帧转换为dict,这样索引标签就不需要匹配:

COLS = ['A', 'B'] # or whichever columns to use for comparison

df1[~df1[COLS].isin(df2[COLS].to_dict(
    orient='list')).all(axis=1)]

相关问题 更多 >