如何用补充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
解决方案
错误原因分析
你的循环逻辑存在两个核心问题:
- 取出的
country本身就是nan_rows里的NaN值,赋值后未做任何有效填充 - 嵌套循环操作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
相关产品推荐
相关产品推荐

