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
相关产品推荐
相关产品推荐

