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

如何在Pandas中基于两列独立匹配创建新的合并DataFrame?

Pandas: Filter df2 Rows Where Any Value Matches Any Value in df1

我拥有两个DataFrame,希望合并后的结果DataFrame包含df2中满足以下条件的所有行:df2中该行的任意一列值存在于df1的任意一列值中(即类似vlookup但针对行的单个值进行匹配,只要df1的任意一列中存在与df2任意一列相同的值,该行就被保留)。

具体数据如下:
df1:

a    b
0  a   bb
1 aa    c
2  b   cc
3 bb   aa

df2:

a    b
0  a    e
1 aa    d
2  b   dd
3 bb   ee
4  c    a
5 cc    d
6  d    b
7 dd    e
8  e   aa
9 ee    d

预期的合并结果DataFrame为:

merge:
   a    b
0  a    e
1 aa    d
2  b   dd
3 bb   ee
4  c    a
5  d    b
6  e   aa

我尝试过以下两种方法:

merge = df1.merge(df2, on=['a', 'b'], how='outer')
merge = df1.append(df2).drop_duplicates()

但均无法得到预期的合并结果,请问在Pandas中该如何实现这一需求?


实现思路

你需要的是行级的单值匹配过滤:先提取df1中所有出现过的唯一值,再检查df2的每一行是否有任意值属于这个集合,最后保留符合条件的行。这种方式和你之前尝试的整行匹配/去重逻辑完全不同,能精准满足你的需求。

具体代码实现

import pandas as pd

# 构造示例数据
df1 = pd.DataFrame({
    'a': ['a', 'aa', 'b', 'bb'],
    'b': ['bb', 'c', 'cc', 'aa']
})

df2 = pd.DataFrame({
    'a': ['a', 'aa', 'b', 'bb', 'c', 'cc', 'd', 'dd', 'e', 'ee'],
    'b': ['e', 'd', 'dd', 'ee', 'a', 'd', 'b', 'e', 'aa', 'd']
})

# 步骤1:提取df1中所有唯一值,转成集合(集合的查找效率远高于列表)
df1_unique_values = set(df1.stack())

# 步骤2:生成过滤掩码——逐行检查df2是否有值在df1的唯一值集合中
filter_mask = df2.apply(lambda row: any(val in df1_unique_values for val in row), axis=1)

# 步骤3:过滤df2得到最终结果
result = df2[filter_mask]

print(result)

输出结果

运行后会完全匹配你的预期:

a    b
0   a    e
1  aa    d
2   b   dd
3  bb   ee
4   c    a
6   d    b
8   e   aa

为什么之前的方法不行?

  • merge(df2, on=['a','b'], how='outer'):这种方式要求整行的a和b列都完全匹配才会合并,而你需要的是单值跨列匹配,逻辑不匹配。
  • df1.append(df2).drop_duplicates():这是去除完全重复的整行,和“单值存在即可保留”的需求完全无关,自然得不到想要的结果。

内容的提问来源于stack exchange,提问作者user16304089

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 06:13:14