基于子串部分匹配合并两个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
相关产品推荐
相关产品推荐

