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

如何用Pandas将DataFrame中NaN值替换为对应分组均值?

正确实现按分组均值填充NaN的Pandas方案

先说说你原代码的几个问题:

  • groupby("LV_Name").mean(["LEO_Capa", "GTO_Capa"]) 写法错误,mean() 不需要传列名列表,正确的是先选列再求均值,或者用 agg 指定列
  • 直接 for row in df 遍历的是DataFrame的列名,不是行数据,根本没法拿到每一行的LEO_Capa值
  • 就算改成遍历行,Pandas里遍历行得到的是副本,修改副本不会影响原DataFrame,而且遍历行效率极低,完全不符合Pandas的矢量化操作思路

最简正确实现

用Pandas的transform方法结合fillna,一行搞定,这也是最符合Pandas风格的写法:

def fill_in_capabilities(df):
    # 按LV_Name分组,计算LEO_Capa的均值,生成和原df同长度的Series
    leo_mean = df.groupby("LV_Name")["LEO_Capa"].transform("mean")
    # 用分组均值填充LEO_Capa列的NaN
    df["LEO_Capa"] = df["LEO_Capa"].fillna(leo_mean)
    return df

如果需要同时处理GTO_Capa的NaN

要是你也想填充GTO_Capa的NaN,同样用分组均值,可以一次性处理:

def fill_in_capabilities(df):
    # 对指定列按分组计算均值,然后填充对应列的NaN
    df[["LEO_Capa", "GTO_Capa"]] = df.groupby("LV_Name")[["LEO_Capa", "GTO_Capa"]].transform(
        lambda x: x.fillna(x.mean())
    )
    return df

为什么不用遍历?

Pandas的核心是矢量化操作,遍历行的效率比矢量化操作低几个数量级,尤其是数据量大的时候,绝对不要这么干。上面的两种写法都是完全的矢量化操作,既简洁又高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 05:46:09