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

