制药网站数据集合并遇阻:求Pandas匹配合并正确方案
解决方法:统一格式后左连接匹配
你的核心需求是保留第一个数据集(new_df)的全部251条数据,仅在Name匹配时补充第二个数据集(match_data)的产品描述,问题出在直接匹配时Name列的格式不统一(比如大小写、空格、多单词差异),导致匹配失败。以下是可行的步骤:
1. 预处理Name列,统一匹配规则
先对两个数据集的Name列做标准化处理,消除格式差异。比如你之前尝试取match_data中Name的第一个单词,那我们统一按这个规则清理:
import pandas as pd # 处理new_df的Name:转字符串、去首尾空格、转小写 new_df['clean_name'] = new_df['Name'].astype(str).str.strip().str.lower() # 处理match_data的Name:取第一个单词、去空格、转小写 match_data['clean_name'] = match_data['Name'].astype(str) \ .str.split(' ', n=1).str[0] \ .str.strip().str.lower()
注:如果你的匹配规则不是取第一个单词,可调整这里的处理逻辑(比如保留完整名称但统一格式)。
2. 用左连接实现匹配
使用Pandas的merge做左连接,确保保留new_df的所有行:
# 左连接,只关联需要的字段(clean_name和产品描述) merged_df = pd.merge( new_df, match_data[['clean_name', 'Product_Description']], on='clean_name', how='left' ) # 填充未匹配到的产品描述为空字符串 merged_df['Product_description'] = merged_df['Product_Description'].fillna('') # 清理临时列 merged_df = merged_df.drop(columns=['clean_name', 'Product_Description'])
3. 替代方案:用字典映射快速匹配
如果数据量不大,也可以用字典映射实现:
# 构建{清理后的名称: 产品描述}的字典 desc_dict = match_data.set_index('clean_name')['Product_Description'].to_dict() # 直接映射到new_df中 new_df['Product_description'] = new_df['clean_name'].map(desc_dict).fillna('')
为什么之前的方法无效?
- 循环匹配:不仅效率低,还可能因为
new_df['Name'][i]是float(说明存在NaN值),但你的判断逻辑没处理好NaN的情况,且未统一格式导致匹配失败。 - 直接左连接:原Name列格式不统一(比如大小写、多单词),导致实际匹配的行很少,所以只得到106条结果。
最后,建议你先查看new_df['clean_name']和match_data['clean_name']的唯一值,确认匹配规则是否正确,调整预处理逻辑即可。
内容的提问来源于stack exchange,提问作者Lalit Joshi
相关产品推荐
相关产品推荐

