基于指定列比较两个DataFrame,过滤DF1中非匹配行
问题场景
现有两个列集合不同的DataFrame(DF1和DF2),数据如下:
DF1
| col1 | col2 | col3 | col4 | col5 | col6 | col7 |
|---|---|---|---|---|---|---|
| Asr | Suh | dervi | xyz | yes | NY | 2022-04-11 |
| Bas | nav | dervi | xyz | yes | CA | 2022-04-11 |
| Naz | adn | otc | xyz | no | NJ | 2022-05-01 |
DF2
| col1 | col2 | col3 | col4 |
|---|---|---|---|
| Asr | Suh | dervi | xyz |
| Bas | nav | dervi | xyz |
需要基于col2和col3列对比两个DataFrame,筛选出DF1中与DF2不匹配的行,期望结果如下:
df3
| col1 | col2 | col3 | col4 | col5 | col6 | col7 |
|---|---|---|---|---|---|---|
| Naz | adn | otc | xyz | no | NJ | 2022-05-01 |
解决方案1:使用merge结合indicator参数
通过左连接两个DataFrame并添加匹配标识,筛选仅存在于DF1的行:
import pandas as pd # 构造DF1数据 df1 = pd.DataFrame({ 'col1': ['Asr', 'Bas', 'Naz'], 'col2': ['Suh', 'nav', 'adn'], 'col3': ['dervi', 'dervi', 'otc'], 'col4': ['xyz', 'xyz', 'xyz'], 'col5': ['yes', 'yes', 'no'], 'col6': ['NY', 'CA', 'NJ'], 'col7': ['2022-04-11', '2022-04-11', '2022-05-01'] }) # 构造DF2数据 df2 = pd.DataFrame({ 'col1': ['Asr', 'Bas'], 'col2': ['Suh', 'nav'], 'col3': ['dervi', 'dervi'], 'col4': ['xyz', 'xyz'] }) # 左连接并添加匹配状态标识 merged_df = df1.merge(df2[['col2', 'col3']], on=['col2', 'col3'], how='left', indicator=True) # 筛选仅在DF1中存在的行,移除标识列 df3 = merged_df[merged_df['_merge'] == 'left_only'].drop('_merge', axis=1) print(df3)
解决方案2:使用isin结合元组判断
将DF2的col2和col3组合成元组集合,直接判断DF1的行是否不在该集合内:
import pandas as pd # 构造DF1、DF2数据(代码同方案1,此处省略) # 生成DF2中col2+col3的元组集合 df2_key_set = set(zip(df2['col2'], df2['col3'])) # 筛选DF1中不在集合内的行 df3 = df1[~df1.apply(lambda row: (row['col2'], row['col3']) in df2_key_set, axis=1)] print(df3)
两种方法均可得到目标结果,其中方案1在数据量较大时性能更优。
内容的提问来源于stack exchange,提问作者Koushur
相关产品推荐
相关产品推荐

