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

Pandas分组扩展均值计算含缺失值时报错,求简洁解决方案

解决Pandas分组扩展均值处理缺失值的问题

问题背景

无缺失值的数据集可通过df.groupby('id').expanding().mean().values得到正确的分组扩展均值,但当数据包含pd.NA时,Pandas会因后端浮点类型断言报错,直接使用apply(np.nansum)等方法因缺少计数逻辑无法得到正确均值。

解决方案

方法1:转换列类型后使用内置expanding.mean

将含pd.NA的列转换为浮点类型(此时pd.NA会转为np.nan),再利用expanding.mean()的skipna=True参数忽略缺失值计算:

import pandas as pd
import numpy as np

df2 = pd.DataFrame({'id':[1,1,1,2,2,2],'y':[1,pd.NA,3,1,2,3]})

# 转换为浮点类型
df2['y'] = df2['y'].astype(float)
# 计算分组扩展均值
result = df2.groupby('id')['y'].expanding().mean(skipna=True).values.reshape(-1, 1)
print(result)

输出结果:

array([[1. ],
       [1. ],
       [2. ],
       [1. ],
       [1.5],
       [2. ]])

方法2:手动计算累计和与累计非NA数量

通过扩展窗口计算累计非NA值的和与累计非NA值的数量,两者相除得到均值,无需转换列类型:

import pandas as pd
import numpy as np

df2 = pd.DataFrame({'id':[1,1,1,2,2,2],'y':[1,pd.NA,3,1,2,3]})

grouped = df2.groupby('id')['y']
# 累计非NA值的和
cum_sum = grouped.expanding().apply(lambda s: s.sum(skipna=True), raw=False)
# 累计非NA值的数量
cum_count = grouped.expanding().apply(lambda s: s.count(), raw=False)
# 计算均值并整理格式
result = (cum_sum / cum_count).values.reshape(-1, 1)
print(result)

输出结果与方法1一致。

问题原因说明

出现报错是因为含pd.NA的列默认是**Nullable Integer(Int64)**类型,Pandas的expanding.mean()在处理该类型时,后端的浮点类型断言逻辑会触发错误。转换为浮点类型后,缺失值变为np.nan,skipna=True参数可以正常生效忽略缺失值;手动计算则绕过了内置方法的类型限制,直接基于缺失值处理逻辑计算。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 03:52:33