Python实现类似Excel VLOOKUP的部分字符串匹配合并DataFrame
公司名部分匹配合并解决方案
报错原因
- 第一种方案报错
TypeError: string indices must be integers的核心问题是:for i in marketing_df默认遍历的是DataFrame的列名(字符串类型),用字符串作为对象取i['CompanyMKTG']不符合语法要求。同时Python没有issubstring方法,子串判断需要用a in b的写法。 - 第二种方案报错
IndexError: single positional indexer is out-of-bounds的原因是:部分销售侧公司名在营销数据集里没有匹配项,loc筛选后得到空序列,调用.iloc[0]时索引越界。
可行实现方案
方案1:双向子串匹配(直接满足部分匹配要求)
思路是遍历营销数据的每一个公司名,判断是否和销售侧任意公司名存在「A包含B或B包含A」的子串关系,匹配成功就保留,否则过滤。
# 提取销售侧清洗后的唯一公司名列表 sales_comp_list = sales_df['CompanySales'].unique().tolist() # 定义匹配函数,返回匹配到的销售侧公司名,无匹配返回None def match_company(mktg_comp): for sales_comp in sales_comp_list: # 双向子串判断,满足任意一种就算匹配成功 if sales_comp in mktg_comp or mktg_comp in sales_comp: return sales_comp return None # 给营销数据集添加匹配结果字段 marketing_df['MatchedSalesCompany'] = marketing_df['CompanyMKTG'].apply(match_company) # 过滤出匹配成功的行,就是你需要的结果 result_df = marketing_df[marketing_df['MatchedSalesCompany'].notna()].copy() # 导出结果 result_df.to_csv('matched_marketing_contacts.csv', index=False)
方案2:模糊相似度匹配(兼容拼写、特殊字符差异)
如果存在拼写差异(比如重音符号、单引号差异),可以用模糊相似度匹配,阈值可根据业务需求调整:
# 先安装依赖:pip install fuzzywuzzy python-Levenshtein from fuzzywuzzy import fuzz sales_comp_list = sales_df['CompanySales'].unique().tolist() def fuzzy_match(mktg_comp, threshold=80): for sales_comp in sales_comp_list: if fuzz.ratio(mktg_comp, sales_comp) >= threshold: return sales_comp return None marketing_df['MatchedSalesCompany'] = marketing_df['CompanyMKTG'].apply(fuzzy_match) result_df = marketing_df[marketing_df['MatchedSalesCompany'].notna()].copy()
内容的提问来源于stack exchange,提问作者DonMega0521
相关产品推荐
相关产品推荐

