如何用Python/Pandas实现两DataFrame列间部分字符串匹配并新增匹配列?
解决DataFrame间部分字符串匹配并新增列的问题
需求说明
将两个Excel表加载为DataFrame后,需要用df1的System列(系统编码)与df2的Description列(描述文本)做部分字符串匹配,若描述文本中包含某个系统编码,则为df2新增一列填入对应的编码;无匹配则留空。
问题分析
你之前的代码逻辑有误:是给df1新增列,判断的是整个df2的描述列是否包含当前系统编码,而非为df2的每一行匹配对应编码,因此无法满足需求。
解决方案
以下提供几种可行的实现方式,可根据数据规模和需求选择:
方法1:遍历匹配(适合小数据量)
通过apply遍历df2的每一行描述,逐个匹配df1中的系统编码:
import pandas as pd # 示例数据 df1 = pd.DataFrame( { "System": ["HFW", "SYS", "ABC"], "Description": ["HFW Description", "Sys Description", "ABC Description"], } ) df2 = pd.DataFrame( { "Description": [ "Amount spent for HFW", "Spending amt on XYZ", "INV20563BG", "ABC Cost", "ABC Cost 2", ], "Amount": ["150", "175", "160", "180", "100"], } ) # 提取系统编码列表 sys_codes = df1["System"].tolist() # 定义匹配函数:返回第一个匹配的编码,无匹配则返回None def match_system(desc): for code in sys_codes: if code in desc: return code return None # 为df2新增匹配列 df2["MatchingSystem"] = df2["Description"].apply(match_system)
执行后df2的结果:
| Description | Amount | MatchingSystem |
|---|---|---|
| Amount spent for HFW | 150 | HFW |
| Spending amt on XYZ | 175 | None |
| INV20563BG | 160 | None |
| ABC Cost | 180 | ABC |
| ABC Cost 2 | 100 | ABC |
方法2:正则表达式提取(适合大数据量)
利用str.extract做向量式匹配,效率远高于循环,适合数据量大的场景:
# 构建正则模式:匹配任意一个系统编码 pattern = "|".join(df1["System"].tolist()) # 提取第一个匹配的编码,无匹配则返回NaN df2["MatchingSystem"] = df2["Description"].str.extract(f"({pattern})", expand=False)
方法3:匹配多个编码(若一行描述对应多个编码)
如果需要返回所有匹配的编码,可修改匹配函数:
def match_all_systems(desc): matches = [code for code in sys_codes if code in desc] return ",".join(matches) if matches else None df2["MatchingSystems"] = df2["Description"].apply(match_all_systems)
内容的提问来源于stack exchange,提问作者user19778438
相关产品推荐
相关产品推荐

