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

