理解Group By对缺失值的处理及.mean()与手动计算均值的差异
问题原因
pandas自带的groupby.mean()方法计算均值时,会默认跳过所有NA值:分子仅对非NA的delta_t求和,分母也仅统计非NA的delta_t数量,因此和你手动用pid总出现次数作为分母的计算逻辑不符。
调整方案
你可以通过自定义分组聚合逻辑来实现需求:分子忽略NA值求和,分母取对应pid分组的总观测数(含NA行),两种实现方式如下:
写法1:单步lambda聚合
df2 = df1.reset_index().groupby('pid')['delta_t'].agg( avg_delta = lambda s: s.sum(skipna=True) / s.size ).reset_index().set_index('pid')
s.sum(skipna=True):自动忽略NA值计算当前pid的delta_t总和,作为分子s.size:返回当前pid分组下的总行数(包含delta_t为NA的行),作为分母
写法2:分步骤计算(更适合大数据量,可读性更高)
# 先按pid分组 grouped = df1.reset_index().groupby('pid')['delta_t'] # 计算忽略NA的总和 delta_sum = grouped.sum(skipna=True) # 计算pid的总出现次数 total_cnt = grouped.size() # 计算均值后整理成目标格式 df2 = (delta_sum / total_cnt).reset_index(name='delta_t').set_index('pid')
效果验证
以你给出的示例数据中pid=id1为例:
- 总出现次数为3次,
delta_t非NA的值仅为1 - 调整前默认
mean()结果为1/1=1 - 调整后计算结果为
1/3≈0.333,和手动计算逻辑一致
内容的提问来源于stack exchange,提问作者S44
相关产品推荐
相关产品推荐

