gpt4 book ai didi

python - Pandas:通过多列查找另一个DataFrame中不存在的行

转载 作者:IT老高 更新时间:2023-10-28 20:46:07 35 4
gpt4 key购买 nike

python pandas: how to find rows in one dataframe but not in another? 相同但有多个列

这是设置:

import pandas as pd

df = pd.DataFrame(dict(
col1=[0,1,1,2],
col2=['a','b','c','b'],
extra_col=['this','is','just','something']
))

other = pd.DataFrame(dict(
col1=[1,2],
col2=['b','c']
))

现在,我想从 df 中选择其他不存在的行。我想通过 col1col2

进行选择

在 SQL 中我会这样做:

select * from df 
where not exists (
select * from other o
where df.col1 = o.col1 and
df.col2 = o.col2
)

在 Pandas 中我可以做这样的事情,但感觉非常难看。如果 df 有 id-column ,则可以避免部分丑陋,但它并不总是可用。

key_col = ['col1','col2']
df_with_idx = df.reset_index()
common = pd.merge(df_with_idx,other,on=key_col)['index']
mask = df_with_idx['index'].isin(common)

desired_result = df_with_idx[~mask].drop('index',axis=1)

那么也许还有更优雅的方式?

最佳答案

由于 0.17.0 有一个新的 indicator你可以传递给 merge 的参数,它会告诉你这些行是只出现在左边、右边还是两者都有:

In [5]:
merged = df.merge(other, how='left', indicator=True)
merged

Out[5]:
col1 col2 extra_col _merge
0 0 a this left_only
1 1 b is both
2 1 c just left_only
3 2 b something left_only

In [6]:
merged[merged['_merge']=='left_only']

Out[6]:
col1 col2 extra_col _merge
0 0 a this left_only
2 1 c just left_only
3 2 b something left_only

因此您现在可以通过仅选择 'left_only' 行来过滤合并的 df

关于python - Pandas:通过多列查找另一个DataFrame中不存在的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32652718/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com