如何用字典根据另一列值替换DataFrame某列的值
基于Country列替换Region缺失值并保留已有数据
问题背景
给定映射字典:
region_rename = {"Gambia": "Sub-Saharan Africa", "North Macedonia": "Central and Eastern Europe"}
DataFrame data_2019 初始数据:
| Country | Region | GDP |
|---|---|---|
| Gambia | NaN | 200 |
| North Macedonia | NaN | 300 |
| USA | North America | 400 |
期望输出:
| Country | Region | GDP |
|---|---|---|
| Gambia | Sub-Saharan Africa | 100 |
| North Macedonia | Central and Eastern Europe | 200 |
| USA | North America | 300 |
核心需求:根据Country列的值用字典替换Region列的缺失值,同时保留已有正确地区的数据。
尝试过的错误代码及问题
- 返回布尔值,无法完成赋值:
data_2019["Region"] = [data_2019.loc[data_2019["Country or region"] == r, "Region"] == region_rename[r] for r in region_rename]
- 逻辑错误,提示输出歧义:
sample["Region"] = sample["Region"].apply([lambda r: region_rename[r] if sample["Region"] == r else "" for r in region_rename])
- 覆盖已有正确地区数据,导致非目标国家Region变为NaN:
sample["Region"] = sample["Country or region"].map(region_rename)
正确解决方案
方法1:fillna结合map(推荐)
利用map根据Country列生成对应地区,再用fillna仅填充Region列的缺失值,已有值保持不变:
data_2019["Region"] = data_2019["Region"].fillna(data_2019["Country"].map(region_rename))
方法2:loc精准定位赋值
先筛选出Region为NaN且Country在字典中的行,再针对性赋值:
mask = data_2019["Region"].isna() & data_2019["Country"].isin(region_rename.keys()) data_2019.loc[mask, "Region"] = data_2019.loc[mask, "Country"].map(region_rename)
方法3:if-then语句(适合字典条目较少时)
因为字典仅包含两个国家,可直接逐个判断赋值:
# 填充Gambia的Region缺失值 data_2019.loc[(data_2019["Country"] == "Gambia") & (data_2019["Region"].isna()), "Region"] = "Sub-Saharan Africa" # 填充North Macedonia的Region缺失值 data_2019.loc[(data_2019["Country"] == "North Macedonia") & (data_2019["Region"].isna()), "Region"] = "Central and Eastern Europe"
以上三种方法均可实现需求:仅填充Region列的缺失值,同时保留USA等已有正确地区的数据。
内容的提问来源于stack exchange,提问作者user20443632
相关产品推荐
相关产品推荐

