如何实现当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
相关产品推荐
相关产品推荐

