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

pandas groupby.mean()未按预期忽略NaN值问题求助

问题原因&解决方案

1. 核心问题排查:数值列类型错误

如果你的b列是object类型而非数值类型(int/float),pandas无法识别其中的NaN为缺失值,会直接返回NaN作为聚合结果。
先执行代码校验列类型:

print(tdf.dtypes)

如果a/b列不是数值类型,先做类型转换:

# 转换为数值类型,非法值自动转为合法NaN
tdf['a'] = pd.to_numeric(tdf['a'], errors='coerce')
tdf['b'] = pd.to_numeric(tdf['b'], errors='coerce')

2. 循环逻辑错误

你的代码中i从0开始遍历,但示例数据的Test #取值为1、2,当i=0时筛选出来的是空DataFrame,空数据聚合自然返回NaN。你可以直接遍历Test #的实际取值,避免硬编码范围出错:

# 替换原来的while循环逻辑,自动适配所有Test #取值
for test_id in tdf['Test #'].unique():
    # 后续聚合逻辑不变,把i替换为test_id即可

3. skipna参数报错解决方案

如果使用的是1.1.0以下版本的pandas,分组聚合的mean()/std()不支持直接传入skipna参数,可以用自定义聚合的方式实现:

# 示例:计算均值时强制跳过NaN
results = tdf.loc[tdf["Test #"] == test_id].groupby(["Test #"]).agg(
    a=('a', lambda x: x.mean(skipna=True)),
    b=('b', lambda x: x.mean(skipna=True))
)

优化实现(无需循环)

你可以直接一次性完成所有分组的多指标计算,代码更简洁高效:

import pandas as pd

# 定义单组统计函数
def calc_group_stats(group_df):
    mean = group_df.mean(numeric_only=True, skipna=True)
    std = group_df.std(numeric_only=True, skipna=True)
    ci_95 = 2 * std
    return pd.DataFrame([mean, std, ci_95], index=['mean', 'std', '95%_ci'])

# 一次性分组计算所有指标
new_df = tdf.groupby('Test #', group_keys=False).apply(calc_group_stats).reset_index()
new_df.rename(columns={'level_1': 'stat_type'}, inplace=True)

基于你的示例数据运行后,Test #=1对应的mean行a值为2,b值为1.5,符合预期。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 19:39:05