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

Python中用字典替换DataFrame空值失败,求解决方法

问题解决:填充DataFrame中按Name分组的缺失Weight值

原代码存在的问题

  • 字典迭代错误:for k,v in dic应改为for k,v in dic.items(),否则会抛出ValueError(字典默认迭代键,无法直接解包为键值对)
  • 缺失值判断错误:pandas中的缺失值为np.nan,不能用== None判断,需用pd.isna()或np.isnan()
  • 链式索引修改问题:df['Weight'][i]属于链式索引,修改操作可能无法作用于原DataFrame,应使用df.loc[i, 'Weight']

更高效的解决方案(无需循环)

对于大型DataFrame,循环遍历效率极低,推荐使用pandas内置分组填充方法:

方法1:groupby.transform + fillna

按Name分组,用每组的有效值(与原逻辑一致取max)填充缺失值:

import pandas as pd
import numpy as np

lst1 = ["AA","BB","CC","AA","BB","CC","AA","BB","CC"]
lst2 = [12,np.nan,14,12,15,14,np.nan,np.nan,14]
df = pd.DataFrame(list(zip(lst1,lst2)), columns = ['Name','Weight'])

# 按Name分组,用组内最大值填充缺失
df['Weight'] = df.groupby('Name')['Weight'].transform(lambda x: x.fillna(x.max()))
print(df)

方法2:字典映射填充

若坚持使用字典逻辑,可结合map和fillna避免循环:

# 生成每个Name对应的Weight字典
weight_dict = df.groupby('Name')['Weight'].max().to_dict()
# 用字典映射填充缺失值
df['Weight'] = df['Weight'].fillna(df['Name'].map(weight_dict))
print(df)

修复后的循环代码(不推荐用于大型DataFrame)

若必须使用循环,修正后代码如下:

import pandas as pd
import numpy as np

lst1 = ["AA","BB","CC","AA","BB","CC","AA","BB","CC"]
lst2 = [12,np.nan,14,12,15,14,np.nan,np.nan,14]
df = pd.DataFrame(list(zip(lst1,lst2)), columns = ['Name','Weight'])

df_2 = df.groupby('Name')['Weight'].max()
dic = df_2.to_dict()

# 修正循环逻辑
for k, v in dic.items():
    for i in range(len(df)):
        if pd.isna(df.loc[i, 'Weight']) and df.loc[i, 'Name'] == k:
            df.loc[i, 'Weight'] = v
print(df)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 04:10:19