设置
我有2个熊猫dfs(df1和df2),其中包含一些重叠的行和一些不重叠的行。
两个df都有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)))]
我该如何解决?
答案 0 :(得分:1)
我认为没有相同类型的列,因此首先将其转换为string
,然后将其转换为merge
与indicator=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)