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

pandas DataFrame按groupby分组计算均值并填充组内0值的实现方法

实现pandas分组统计填充组内0值的两种方案

方案1:推荐的向量化实现(无需手动写循环,性能更高)

直接使用pandas的groupby.transform批量计算分组填充值,再替换0值,代码更简洁高效:

import pandas as pd

df = pd.DataFrame({
    'City': ['SF','NYC','SF','NYC','SF','CHI','LA','LA','CHI'], 
    'Val': [2,4,0,0,7,4,3,5,6] 
})

# 计算每个城市的非0值整数均值,广播到和原df行数一致的序列
fill_mean = df.groupby('City')['Val'].transform(lambda x: int(x[x!=0].mean()))
# 将Val列等于0的位置替换为对应分组的均值
df['Val'] = df['Val'].mask(df['Val'] == 0, fill_mean)

print(df)

运行输出结果:

City  Val
0   SF    2
1  NYC    4
2   SF    4
3  NYC    4
4   SF    7
5  CHI    4
6   LA    3
7   LA    5
8  CHI    6

方案2:基于现有for循环的修改

只需要在循环内计算完mean_val后,给原df对应位置赋值即可,注意修正原代码里的变量名冲突问题(最初定义的df变量名为df1,后续循环调用时用了df):

import pandas as pd

df = pd.DataFrame({
    'City': ['SF','NYC','SF','NYC','SF','CHI','LA','LA','CHI'], 
    'Val': [2,4,0,0,7,4,3,5,6] 
})

for name, group in df.groupby(['City']):
    # 计算当前分组非0值的整数均值
    mean_val = int(group[group['Val'] != 0]['Val'].mean())
    # 替换当前分组内的0值
    df.loc[(df['City'] == name) & (df['Val'] == 0), 'Val'] = mean_val

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 20:18:03