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

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,提问作者Константин Прудников

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 09:24:03