Python中如何通过pandas匹配两个DataFrame含指定子串的对应行
Pandas 实现方案
pandas 有成熟的方案可实现上述需求,以下是可直接运行的代码:
1. 构造测试数据
import pandas as pd # 第一张表 df1 = pd.DataFrame({ "N": [1, 2, 3], "COLOR": ["117116C25", "117116C28", "JP-1989-1-9"] }) # 第二张表 df2 = pd.DataFrame({ "ART": ["SH034-117116C28", "SH091B-117116C28", "SH091B-JP-1989-1-9", "SH077-117116c28"] })
2. 核心功能实现
方案1:笛卡尔积关联+过滤(逻辑最直观,适合中小数据量)
通过全关联后匹配子串的方式实现,代码易维护:
# 统一转为小写实现不区分大小写匹配 df1["color_lower"] = df1["COLOR"].str.lower() df2["art_lower"] = df2["ART"].str.lower() # 全关联两张表 cross_df = df1.merge(df2, how="cross") # 过滤出ART包含COLOR子串的行 result = cross_df[cross_df.apply(lambda x: x["color_lower"] in x["art_lower"], axis=1)][["N", "COLOR", "ART"]].reset_index(drop=True)
方案2:正则匹配(性能更优,适合df1行数远小于df2的场景)
避免生成笛卡尔积,大数据量下效率更高:
import re # 拼接正则匹配规则,统一转为小写 pattern = "|".join(df1["COLOR"].str.lower().tolist()) # 提取ART字段中匹配到的COLOR子串 df2["matched_color_lower"] = df2["ART"].str.lower().str.extract(f"({pattern})", expand=False) # 关联df1获取对应的N和原始COLOR值 result = df2.merge( df1.assign(color_lower=df1["COLOR"].str.lower()), left_on="matched_color_lower", right_on="color_lower", how="inner" )[["N", "COLOR", "ART"]].reset_index(drop=True)
3. 输出结果验证
两种方案最终得到的result均符合需求:
N COLOR ART 0 2 117116C28 SH034-117116C28 1 2 117116C28 SH091B-117116C28 2 2 117116C28 SH077-117116c28 3 3 JP-1989-1-9 SH091B-JP-1989-1-9
内容的提问来源于stack exchange,提问作者Константин Прудников
相关产品推荐
相关产品推荐

