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

