Pandas如何通过子串匹配实现两个DataFrame的字段关联合并
pandas实现项目名与动态样式表的关联匹配
实现思路
不需要硬编码样式匹配规则,直接基于动态更新的df1自动生成匹配逻辑,逐行扫描df2的项目名字段,命中样式名子串时关联对应样式ID,未命中则留空。
可直接运行的代码
导入依赖后替换成你自己的真实df1、df2即可使用:
import pandas as pd # -------------------------- # 此处替换为你的真实df1、df2 # df1 结构:style_gid, style_name(3位大写字母,条目动态变化) # df2 结构:project_gid, project_name # -------------------------- # 示例测试数据(可删除) df1 = pd.DataFrame({ "style_gid": ["s001", "s002", "s003"], "style_name": ["ABC", "DEF", "XYZ"] }) df2 = pd.DataFrame({ "project_gid": ["p001", "p002", "p003", "p004"], "project_name": ["2024ABC春季项目", "DEF专项迭代", "通用运营项目", "双XYZ大促项目"] }) # 1. 基于df1动态生成正则匹配规则,支持匹配任意一个样式名 match_pattern = "|".join(df1["style_name"].tolist()) # 2. 提取每个项目名中命中的样式名,无匹配返回空值 df2["match_style_name"] = df2["project_name"].str.extract(f"({match_pattern})", expand=False) # 3. 左关联拿到对应的style_gid,清理临时列得到最终结果 final_df = df2.merge( df1.rename(columns={"style_name": "match_style_name"}), on="match_style_name", how="left" ).drop(columns=["match_style_name"])
注意事项
- 匹配逻辑会识别
project_name任意位置的样式名,不管子串在字段开头、中间还是结尾都能正常命中 df1后续新增、删除、修改样式条目时不需要调整代码,重新运行即可自动适配最新的匹配规则- 无匹配的项目行,
style_gid、style_name字段会自动填充空值NaN - 若存在单个项目名同时包含多个样式名的特殊场景,上述代码会默认返回第一个命中的样式;如果需要支持一对多匹配,可以把
str.extract替换为str.findall后再做行展开即可。
内容的提问来源于stack exchange,提问作者Ben Greenwood
相关产品推荐
相关产品推荐

