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

如何用补充DataFrame填充data_df中country_name列的NaN值

问题:用城市-国家映射表填充DataFrame的缺失国家值

问题背景

  • 原始DataFrame data_df 的country_name列存在427个缺失值(NaN),city_name列仅1行无城市名称
  • 另有一个包含261条城市-国家对应数据的DataFrame new_country_missing_df,需用该数据填充data_df中country_name列的NaN值
  • 尝试嵌套循环匹配城市名实现填充时,出现数据行数增加的问题,错误代码如下:
for city_index, city_name in enumerate(nan_rows["city_name"]):
    country =  nan_rows.iloc[city_index]["country_name"]
    print(f"City index is {city_index} and City name is {city_name} and county is {country}")
    for city in new_country_missing_df["city_name"]:
        if city ==  city_name:
            nan_rows.loc[city_index, "country_name"] = country

示例数据

nan_rows DataFrame:

country_name           city_name
535            NaN           Granville 
654            NaN  Kingston Upon Hull
787            NaN       New Waterford 
801            NaN           Kingstown 

new_country_missing_df DataFrame:

city_name                           country
0             Granville                            France
1    Kingston Upon Hull                    United Kingdom
2         New Waterford                            Canada
3             Kingstown  Saint Vincent and the Grenadines
4              Nanakuli                     United States

解决方案

错误原因分析

你的循环逻辑存在两个核心问题:

  1. 取出的country本身就是nan_rows里的NaN值,赋值后未做任何有效填充
  2. 嵌套循环操作DataFrame行时,易因索引操作不当触发行复制,导致数据行数增加

推荐使用Pandas内置高效方法,避免手动循环:


方法1:使用map快速映射(推荐)

先把new_country_missing_df转换成城市-国家字典,再通过map匹配填充缺失值:

# 1. 构建城市到国家的映射字典
city_to_country = new_country_missing_df.set_index('city_name')['country'].to_dict()

# 2. 仅对country_name为NaN的行,用city_name匹配字典填充
data_df['country_name'] = data_df['country_name'].fillna(
    data_df['city_name'].map(city_to_country)
)

方法2:使用merge左连接填充

通过左连接将两个DataFrame按city_name关联,再合并结果:

# 1. 左连接两个DataFrame,保留data_df的所有行
merged_df = data_df.merge(
    new_country_missing_df,
    on='city_name',
    how='left',
    suffixes=('', '_fill')
)

# 2. 用填充列的值替换原country_name的NaN
data_df['country_name'] = merged_df['country_name'].fillna(merged_df['country'])

补充说明

  • 两种方法都不会增加数据行数,且比手动循环效率高得多(尤其适合大数据集)
  • 注意处理city_name的空格问题:如果示例中城市名前后有空格,需先统一清理,否则会匹配失败:
    # 清理城市名前后空格
    data_df['city_name'] = data_df['city_name'].str.strip()
    new_country_missing_df['city_name'] = new_country_missing_df['city_name'].str.strip()
    

内容的提问来源于stack exchange,提问作者alson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 16:47:44