繁体   English   中英

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

[英]Drop rows pandas based on combination of matched column values with other dataframe

设置

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

两个 dfs 都有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)))]

我该如何解决这个问题?

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

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM