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

Jupyter Notebook中DataFrame按State填充Population列NaN值失败求助

问题分析与解决方法

原代码失效原因

你的循环中使用Data.loc[Data['State'] == x,'Population'].fillna(..., inplace=True)的写法存在链式索引问题:这种方式返回的可能是原DataFrame的视图而非副本,inplace=True修改的是临时视图,无法同步到原DataFrame,导致NaN值没被填充。另外手动循环的方式不仅效率低,还容易出现索引匹配错误。

快速解决方法(推荐)

用pandas原生的groupby.transform方法,一行代码就能完成按州填充均值的需求,高效且避免索引问题:

Data['Population'] = Data['Population'].fillna(Data.groupby('State')['Population'].transform('mean'))
  • groupby('State')['Population'].transform('mean')会为每一行返回对应州的Population均值,和原DataFrame的行数完全匹配
  • 直接用fillna将NaN值替换为对应州的均值,无需手动循环

修正原代码的写法

如果坚持要保留循环逻辑,需要避免链式索引,直接通过loc定位赋值:

# 先计算每个州的均值,和你原代码一致
DataGroupby = Data.groupby(['State'])['Population'].mean().reset_index()

# 循环每个州,直接赋值给原DataFrame的对应位置
for idx, row in DataGroupby.iterrows():
    state = row['State']
    state_mean = row['Population']
    # 定位该州且Population为NaN的行,直接赋值
    Data.loc[(Data['State'] == state) & (Data['Population'].isna()), 'Population'] = state_mean

这种写法直接操作原DataFrame的对应位置,不会出现视图/副本的问题,能确保修改生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 02:22:43