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

如何用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的结果:

DescriptionAmountMatchingSystem
Amount spent for HFW150HFW
Spending amt on XYZ175None
INV20563BG160None
ABC Cost180ABC
ABC Cost 2100ABC

方法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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 20:48:46