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

使用字典映射填充DataFrame缺失列时返回NaN的问题求助

解决DataFrame用字典映射填充缺失值返回NaN的问题

我来帮你搞定这个问题!先明确一下你的场景:

你有一个存在缺失值的DataFrame:

import pandas as pd

data = {
    'City': ['Chicago', 'Boston', 'San Diego', 'Los Angeles', 'San Francisco', 'Sacramento', 'Vancouver', 'Toronto'],
    'State': ['IL', None, 'CA', 'CA', None, None, 'BC', None],
    'Country': ['United States', None, 'United States', 'United States', None, None, 'Canada', None]
}
df = pd.DataFrame(data)

同时你有三个对应缺失城市的补全列表:

city_list = ['Boston', 'San Francisco', 'Sacramento', 'Toronto']
state_list = ['MA', 'CA', 'CA', 'ON']
country_list = ['United States', 'United States', 'United States', 'Canada']

你尝试用字典映射填充,但结果返回NaN,核心问题是你没有把City作为匹配的主键来关联对应的补全数据——直接按列映射的话,程序根本不知道哪个缺失值对应哪个城市的State/Country。

下面给你两种可行的解决方法:

方法1:构造城市-补全信息映射字典,逐行填充

首先把三个列表整合成一个以城市为键,包含对应State和Country的字典,这样就能精准匹配:

# 构造映射字典,键是城市,值是包含State和Country的子字典
city_mapping = {
    city: {'State': state, 'Country': country}
    for city, state, country in zip(city_list, state_list, country_list)
}

然后用apply遍历每一行,发现缺失值时就从字典里取对应数据填充:

def fill_missing_values(row):
    # 当State或Country为空,且当前城市在映射字典中时填充
    if pd.isna(row['State']) or pd.isna(row['Country']):
        if row['City'] in city_mapping:
            row['State'] = city_mapping[row['City']]['State']
            row['Country'] = city_mapping[row['City']]['Country']
    return row

# 应用函数完成填充
filled_df = df.apply(fill_missing_values, axis=1)

方法2:更高效的map+fillna组合(适合大数据量)

如果你的DataFrame数据量很大,逐行遍历效率较低,可以分别为State和Country构造单独的映射字典,用map结合fillna快速填充:

# 分别构造城市到State、城市到Country的映射
state_map = dict(zip(city_list, state_list))
country_map = dict(zip(city_list, country_list))

# 填充State和Country的缺失值
df['State'] = df['State'].fillna(df['City'].map(state_map))
df['Country'] = df['Country'].fillna(df['City'].map(country_map))

最终填充后的结果

执行完上面任意一种方法后,你的DataFrame会变成完整的样子:

City State         Country
0       Chicago    IL  United States
1        Boston    MA  United States
2     San Diego    CA  United States
3  Los Angeles    CA  United States
4  San Francisco    CA  United States
5    Sacramento    CA  United States
6     Vancouver    BC          Canada
7        Toronto    ON          Canada

再回头说为什么之前会返回NaN:通常是因为你构造字典的方式不对(比如没有以City为键),或者填充时没有通过City列去关联补全数据,导致程序找不到匹配项,所以返回NaN。比如如果你直接用df['State'] = df['State'].replace(state_list),这种操作完全没有关联城市,自然匹配不上。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:56:05