根据匹配的列值与其他数据框的组合来删除行熊猫

时间:2019-02-08 09:52:54

标签: python pandas dataframe

设置

我有2个熊猫dfs(df1和df2),其中包含一些重叠的行和一些不重叠的行。

两个df都有order_idshop列。

现在,如果df1中的行与order_idshop组合的df2中的任何行匹配,则应从df1中删除该行。如果该行与order_idshop上df2中的任何行都不匹配,则应保留该行。


示例

df2就是

    order_id    shop
0     12345     'NL'
1     45678     'FR'
2     12345     'DE'
3     34567     'NL'

现在,如果df1这样,

    order_id    shop
0     12345     'NL'
1     45678     'FR'

然后df1应该返回空。


但是如果df1这样,

        order_id    shop
0       12345       'NL'
1       99999       'FR'
2       12345       'UK'

然后df1应该返回,

        order_id    shop
0       99999       'FR'
1       12345       'UK'

代码

我创建了一个怪异的行,然后就没用了...

到目前为止,我有

result_df = df1[(~df1['order_id'].astype(str).isin(df2['order_id'].astype(str)))]

我该如何解决?

1 个答案:

答案 0 :(得分:1)

我认为没有相同类型的列,因此首先将其转换为string,然后将其转换为mergeindicator=True

df3 = (df1.astype(str).merge(df2.astype(str), how='left', indicator=True)
          .query('_merge == "left_only"')[df1.columns])
print (df3)
   order_id  shop
2     99999  'FR'
3     12345  'UK'

也可以在解决方案之前检查是否相同的dtypes:

print (df1.dtypes)
print (df2.dtypes))

仅转换与dtype不同的列:

df2['order_id'] = df2['order_id'].astype(str)
相关问题