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

如何实现当DF2字符串包含DF1子串时合并Pandas DataFrame?

解决Pandas DataFrame基于子串包含的合并问题

没问题,我来帮你实现这个需求——当DF2的Test1列字符串包含DF1的Test1列子串时,合并两个DataFrame。下面是具体的步骤和代码示例:

1. 定义并查看原始数据

首先创建你提到的两个DataFrame:

import pandas as pd

DF1 = pd.DataFrame({'Test1':list('ABC'), 'Test2':[1,2,3]})
DF2 = pd.DataFrame({'Test1':['ee','bA','cCc','D'], 'Test2':[1,2,3,4]})

查看DF1的输出:

Test1  Test2
0     A      1
1     B      2
2     C      3

查看DF2的输出:

Test1  Test2
0    ee      1
1    bA      2
2   cCc      3
3     D      4

2. 核心思路:建立子串匹配关系

普通的merge只能做精确匹配,我们需要先给DF2的每一行找到对应的DF1中被包含的Test1值,再进行合并。具体步骤如下:

  • 把DF1的Test1所有值拼接成一个正则匹配模式,用来匹配DF2的Test1字符串中的子串
  • 在DF2中提取出匹配到的DF1的Test1值,作为合并的键

3. 具体实现代码

# 构建正则模式:匹配DF1中任意一个Test1子串
pattern = '(' + '|'.join(DF1['Test1']) + ')'

# 在DF2中提取匹配的DF1 Test1值,生成临时匹配列
DF2['matched_Test1'] = DF2['Test1'].str.extract(pattern)

# 以匹配列作为键合并两个DataFrame
# how='left'会保留DF2所有行,匹配不到的会显示NaN;如果只想要匹配成功的行,改成how='inner'
merged_result = DF2.merge(
    DF1,
    left_on='matched_Test1',
    right_on='Test1',
    how='left',
    suffixes=('_DF2', '_DF1')  # 给重复列名加后缀区分
)

# 移除临时匹配列(可选)
merged_result = merged_result.drop('matched_Test1', axis=1)

4. 查看合并结果

运行上述代码后,merged_result的输出为:

Test1_DF2  Test2_DF2 Test1_DF1  Test2_DF1
0        ee          1       NaN        NaN
1        bA          2         A        1.0
2       cCc          3         C        3.0
3         D          4       NaN        NaN

如果只保留匹配成功的行(把how='left'改成how='inner'),结果会是:

Test1_DF2  Test2_DF2 Test1_DF1  Test2_DF1
0        bA          2         A        1.0
1       cCc          3         C        3.0

5. 扩展:不区分大小写的匹配

如果需要忽略大小写进行匹配(比如DF2的'ba'也能匹配DF1的'A'),可以导入re模块并添加匹配标志:

import re

pattern = '(' + '|'.join(DF1['Test1']) + ')'
DF2['matched_Test1'] = DF2['Test1'].str.extract(pattern, flags=re.IGNORECASE)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:02:15