如何用Pandas/Numpy匹配名称相似但不相同的企业字符串集合?
解决方案
核心思路
通过字符串子串匹配实现:df1中的短企业名称是df2对应长名称的一部分,因此遍历df2的每条记录,检查是否包含df1中的任一短名称,以此完成匹配,全程仅使用Pandas原生方法。
代码实现
import pandas as pd # 初始化原始数据 df1 = pd.DataFrame({'Company': ["Apple", "Facebook", "Google"]}) df2 = pd.DataFrame({'Company': ["Apple Inc. Common Stock", "Facebook Common Stock", "Google Alphabet Inc.", "AAON Inc."]}) # 定义匹配函数:从df1中找到包含在长名称里的短企业名,无匹配则返回NA def get_matching_short_name(long_name): return next((short for short in df1['Company'] if short in long_name), pd.NA) # 为df2添加匹配的短名称列 df2['Short_Company'] = df2['Company'].apply(get_matching_short_name) # 整理成目标格式df3 # 拆分匹配/未匹配记录 matched_records = df2.dropna(subset=['Short_Company'])[['Short_Company', 'Company']] unmatched_records = df2[df2['Short_Company'].isna()][['Short_Company', 'Company']] # 合并并设置列名与匹配标记 df3 = pd.concat([matched_records, unmatched_records], ignore_index=True) df3.columns = ['Company', 'Company', 'MATCH?'] df3['MATCH?'] = df3['Company'].notna().map({True: 'YES', False: 'NO'}) # 查看结果 print(df3)
输出结果
运行后得到的df3完全符合需求:
Company Company MATCH? 0 Apple Apple Inc. Common Stock YES 1 Facebook Facebook Common Stock YES 2 Google Google Alphabet Inc. YES 3 <NA> AAON Inc. NO
扩展优化
如果遇到大小写不一致的情况,可以修改匹配逻辑为大小写无关:
def get_matching_short_name(long_name): return next((short for short in df1['Company'] if short.lower() in long_name.lower()), pd.NA)
内容的提问来源于stack exchange,提问作者RafaelP
相关产品推荐
相关产品推荐

