[英]Drop rows pandas based on combination of matched column values with other dataframe
设置
我有 2 个熊猫 dfs(df1 和 df2),其中包含一些重叠行和一些非重叠行。
两个 dfs 都有order_id
和shop
列。
现在,如果 df1 中的一行在order_id
和shop
的组合上与 df2 中的任何行匹配,则应从 df1 中删除该行。 如果该行与order_id
和shop
上的 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.