如何对DataFrame所有唯一分组执行scipy.stats单因素ANOVA检验
原代码的错误根源
scipy.stats.f_oneway的输入要求是:将所有参与对比的样本组以独立的数组形式作为位置参数传入,最少需要2组样本才能输出有效的F统计量。原代码通过循环逐次截取单个城市的数据传入函数,既会因为“仅传入单组数据”触发参数错误,也完全偏离了“一次性对比全部137个城市温度差异”的检验目标。- 原代码中用
all存储唯一城市名称,属于覆盖Python内置关键字的写法,极易引发后续无意义的逻辑报错。
正确实现流程
- 基于DataFrame的City索引完成分组,提取每个城市对应的有效温度一维序列,存入独立列表(列表内每个元素对应一个城市的所有温度观测值)
- 对列表做解包操作,一次性传入
f_oneway完成全量检验计算 - 按照指定格式输出最终结果
可直接运行的实现代码
# 按City索引层级分组,提取清洗后的温度序列 temp_group_list = [] for _, group in Tempvs.groupby(level=0): # 剔除温度列的空值,转为一维numpy数组 clean_series = group["CurrentThermostatTemp"].dropna().values # 跳过空序列,避免触发f_oneway的输入校验错误 if len(clean_series) > 0: temp_group_list.append(clean_series) # 解包所有分组数组,一次性传入函数完成全量ANOVA计算 f_statistic, p_value = f_oneway(*temp_group_list) # 按要求格式输出结果 print(f"针对所有分组的单因素ANOVA检验得到F统计量值为{f_statistic:.4f},对应p值为{p_value:.4g}")
补充说明
- 不需要提前执行
Tempvs.sort_index(inplace=True)操作,pandas的分组逻辑不会因为索引顺序改变影响ANOVA计算结果——F统计量仅依赖组内平方和、组间平方和的数值,和分组的传入顺序无关。 - 代码中加入的空值、空序列过滤逻辑,可以适配原始数据中部分城市存在缺失值、无有效观测的场景,减少不必要的运行报错。
内容的提问来源于stack exchange,提问作者GUILLE DOMINGUEZ
相关产品推荐
相关产品推荐

