You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并列值存在不同变体的两个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 16:55:21