如何匹配两个DataFrame列字符串并填充对应标准名称?
解决方案:Pandas实现别名匹配并填充标准名称
核心思路
先把DF2中逗号分隔的别名拆分成单独行,构建「别名-标准名」的映射关系,再用这个映射去匹配DF1的名称列完成填充。这种矢量化操作比循环高效得多,还能避免循环中容易出现的细节错误(比如空格处理、匹配逻辑漏洞)。
完整代码示例
1. 构造测试数据
import pandas as pd # 示例DF1:待填充的数据集 df1 = pd.DataFrame({ 'DF1_NAME': ['Slau', 'London', 'Paris', 'Moscow', 'Berlin'] }) # 示例DF2:包含别名和对应标准名的数据集 df2 = pd.DataFrame({ 'DF2_ALT_NAME': ['Slau,Slough,Слау', 'London,Londres', 'Paris,Париж', 'Москва,Moscow'], 'DF2_Standard_NAME': ['Slough', 'London', 'Paris', 'Moscow'] })
2. 处理DF2:拆分别名并构建映射
# 将逗号分隔的别名拆分为列表,再展开成多行 df2_exploded = df2.assign(DF2_ALT_NAME=df2['DF2_ALT_NAME'].str.split(',')).explode('DF2_ALT_NAME') # 去除别名前后可能存在的空格(适配数据有空格的情况) df2_exploded['DF2_ALT_NAME'] = df2_exploded['DF2_ALT_NAME'].str.strip()
3. 两种填充方式任选其一
方式一:字典映射(简洁高效)
# 生成「别名→标准名」的字典 name_map = df2_exploded.set_index('DF2_ALT_NAME')['DF2_Standard_NAME'].to_dict() # 填充DF1的目标列 df1['DF1_STANDARD_NAME'] = df1['DF1_NAME'].map(name_map)
方式二:左连接(适合需保留更多DF2字段的场景)
# 左连接DF1和处理后的DF2,仅匹配名称一致的行 df1 = df1.merge( df2_exploded, left_on='DF1_NAME', right_on='DF2_ALT_NAME', how='left' ) # 重命名列并清理冗余字段 df1 = df1.rename(columns={'DF2_Standard_NAME': 'DF1_STANDARD_NAME'}).drop(columns='DF2_ALT_NAME')
效果验证
运行后DF1的结果:
| DF1_NAME | DF1_STANDARD_NAME |
|---|---|
| Slau | Slough |
| London | London |
| Paris | Paris |
| Moscow | Moscow |
| Berlin | NaN |
(注:未匹配到的行会显示NaN,可按需用fillna填充默认值)
内容的提问来源于stack exchange,提问作者Rabeau
相关产品推荐
相关产品推荐

