如何合并列值存在不同变体的两个DataFrame?
解决DataFrame合并时的名称变体匹配问题
针对你遇到的国家名称变体导致merge无法匹配的问题,这里有几种实用的解决方案:
1. 手动构建映射字典(最可控)
如果变体数量不多,手动创建映射字典是最直接且不易出错的方式,把所有变体统一映射到同一个标准名称:
import pandas as pd # 定义国家变体到标准名称的映射 country_mapping = { 'USA': 'United States', 'US': 'United States', 'U.S.': 'United States', 'America': 'United States', 'UK': 'United Kingdom', 'Britain': 'United Kingdom', 'GB': 'United Kingdom' } # 先统一两个DataFrame的列名(比如把df2的Country改成country) df2 = df2.rename(columns={'Country': 'country'}) # 对两个df的country列做替换,未在映射中的值保留原内容 df1['country_unified'] = df1['country'].map(country_mapping).fillna(df1['country']) df2['country_unified'] = df2['country'].map(country_mapping).fillna(df2['country']) # 基于统一后的列执行合并 merged_df = pd.merge(df1, df2, on='country_unified', how='outer')
2. 模糊匹配(适合变体较多的场景)
如果变体太多手动维护麻烦,可以用fuzzywuzzy库做相似度匹配,自动找到最接近的标准名称:
首先安装依赖:
pip install fuzzywuzzy python-Levenshtein
然后编写匹配逻辑:
from fuzzywuzzy import process import pandas as pd # 统一列名 df2 = df2.rename(columns={'Country': 'country'}) # 提取df1中的唯一国家列表作为匹配基准 target_countries = df1['country'].unique() # 定义匹配函数:返回相似度高于80分的最匹配项,否则保留原名称 def match_country(country): match, score = process.extractOne(country, target_countries, score_cutoff=80) return match if score else country # 对df2的country列执行模糊匹配 df2['country_matched'] = df2['country'].apply(match_country) # 执行合并 merged_df = pd.merge(df1, df2, left_on='country', right_on='country_matched', how='outer')
注意:可以根据实际情况调整score_cutoff的值,避免把相似但不同的国家错误匹配。
3. 用标准化库自动转换(适合标准国家名称)
使用pycountry库可以自动识别各种国家名称变体,转换成标准的官方名称:
先安装库:
pip install pycountry
然后实现标准化:
import pycountry import pandas as pd # 定义标准化函数 def standardize_country(country_name): try: # 精确匹配 return pycountry.countries.lookup(country_name).name except LookupError: # 模糊搜索匹配 matches = pycountry.countries.search_fuzzy(country_name) return matches[0].name if matches else country_name # 统一列名 df2 = df2.rename(columns={'Country': 'country'}) # 对两个df的country列做标准化处理 df1['country_standard'] = df1['country'].apply(standardize_country) df2['country_standard'] = df2['country'].apply(standardize_country) # 合并数据 merged_df = pd.merge(df1, df2, on='country_standard', how='outer')
局限性:对于一些非标准地区或小众名称,pycountry可能无法匹配,需要结合手动映射补充。
内容的提问来源于stack exchange,提问作者The Potato
相关产品推荐
相关产品推荐

