You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于指定列比较两个DataFrame,过滤DF1中非匹配行

问题场景

现有两个列集合不同的DataFrame(DF1和DF2),数据如下:

DF1

col1col2col3col4col5col6col7
AsrSuhdervixyzyesNY2022-04-11
BasnavdervixyzyesCA2022-04-11
NazadnotcxyznoNJ2022-05-01

DF2

col1col2col3col4
AsrSuhdervixyz
Basnavdervixyz

需要基于col2和col3列对比两个DataFrame,筛选出DF1中与DF2不匹配的行,期望结果如下:

df3

col1col2col3col4col5col6col7
NazadnotcxyznoNJ2022-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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 17:20:39