for循环中fillna(inplace=True)不生效,如何按分组均值填充缺失值
问题原因
- 你通过
df.loc[df['Director']==i,'Revenue (Millions)']取到的是原始DataFrame的视图副本,对这个副本调用fillna(inplace=True)只会修改临时副本,不会回写到原始df上,pandas不会触发这类隐式操作的报错,所以会出现运行无异常但空值未填充的情况。
解决方法
推荐使用更高效的pandas原生写法,无需手动写循环,性能和可读性都更好:
import pandas as pd df = pd.read_csv('IMDB-Movie-Data.csv') # 按导演分组后对Revenue列做transform,返回和原数据长度对齐的均值序列,直接填充空值 df['Revenue (Millions)'] = df['Revenue (Millions)'].fillna(df.groupby('Director')['Revenue (Millions)'].transform('mean'))
如果要修复你原来的循环写法,去掉inplace参数,直接给.loc筛选出来的位置赋值即可:
df = pd.read_csv('IMDB-Movie-Data.csv') dp = df.groupby('Director')['Revenue (Millions)'].mean() for i in dp.index: # 直接赋值回原df对应位置即可生效 df.loc[df['Director']==i,'Revenue (Millions)'] = df.loc[df['Director']==i,'Revenue (Millions)'].fillna(dp[i])
补充说明
- 如果某导演的所有作品Revenue列全部是空值,分组计算得到的均值本身就是NaN,填充后对应位置仍然是空值,你可以后续再加一步全局填充处理这部分残留空值:
# 示例:用全局均值填充剩余空值,也可以替换为0或其他指定值 df['Revenue (Millions)'] = df['Revenue (Millions)'].fillna(df['Revenue (Millions)'].mean())
内容的提问来源于stack exchange,提问作者HLEE
相关产品推荐
相关产品推荐

