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

基于子串部分匹配合并两个Pandas Dataframe的实现方法

pandas 原生 merge 方法仅支持精确值匹配,无法直接结合 str.contains() 完成子串匹配合并,你可以通过以下两种方案实现需求:

方案1:交叉连接后过滤(适配所有子串匹配场景)

该方案不限制匹配子串的长度和位置,所有子串匹配需求都可以使用:

import pandas as pd

# 你的示例数据
df1 = pd.DataFrame({'Model': ['0RW52HC5KDD13R', '0RW52HC5KDD13U','JJS42HC5JSSAYR']})
df2 = pd.DataFrame({'Group_Var': ['0RW52HC5K', '0RW52HC5K','JJS42HC5J']})

# 提前对df2去重,得到和你预期一致的输出,不需要保留重复Group_Var可以加这步
df2 = df2.drop_duplicates()

# 交叉连接得到所有行列组合
df_cross = df1.merge(df2, how='cross')
# 过滤出Model包含Group_Var子串的记录
df_res = df_cross[df_cross.apply(lambda row: row['Model'].find(row['Group_Var']) != -1, axis=1)]
# 如果确定是前缀匹配,也可以用startswith,性能更高:
# df_res = df_cross[df_cross.apply(lambda row: row['Model'].startswith(row['Group_Var']), axis=1)]

输出结果:

Model Group_Var
0  0RW52HC5KDD13R  0RW52HC5K
2  0RW52HC5KDD13U  0RW52HC5K
4  JJS42HC5JSSAYR  JJS42HC5J

方案2:固定长度匹配(性能更优,适合规则固定的场景)

如果你的Group_Var长度固定(示例中都是9位),且都是前缀匹配,可以直接提取Model的对应长度前缀作为匹配键,用普通merge实现,性能远高于方案1:

# 提取Model前9位作为匹配键
df1['match_key'] = df1['Model'].str[:9]
# 合并后删除临时匹配键
df_res = df1.merge(df2.drop_duplicates(), left_on='match_key', right_on='Group_Var').drop('match_key', axis=1)

内容的提问来源于stack exchange,提问作者James Cook

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 10:45:03