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

使用Kruskal-Wallis检验始终得到NaN值的问题求助

Kruskal-Wallis检验返回NaN的原因与修复方案

问题根源

你的代码存在两个关键问题,导致检验结果全为NaN:

  1. 分组来源错误:你用df[column].unique()获取分组类别,但这是原DataFrame的所有类别。经过dropna(subset=[column, 'age'])过滤后,部分类别可能已经没有有效数据(比如该类别下的age全是缺失值,被dropna彻底移除),导致生成的group_data里包含空的Series。
  2. 缺少有效组校验:Kruskal-Wallis检验要求至少有2个包含数据的组,如果过滤后只剩1个有效组,或者所有组都为空,scipy会直接返回NaN。

修复后的代码

from scipy.stats import kruskal

columns_to_test = ['benefits', 'resources', 'mhd', 'coworker_chat', 'support_options', 'remote']

kruskal_results = []

for column in columns_to_test:
    filtered_data = df.dropna(subset=[column, 'age'])
    # 从过滤后的数据中获取有效分组,避免包含原数据中已被过滤的空组
    valid_groups = filtered_data[column].unique()
    # 生成每组的age数据,同时过滤掉空组
    group_data = [filtered_data[filtered_data[column] == group]['age'] 
                  for group in valid_groups 
                  if not filtered_data[filtered_data[column] == group]['age'].empty]
    
    # 确保至少有2个有效组才执行检验
    if len(group_data) >= 2:
        stat, p = kruskal(*group_data)
        kruskal_results.append({'Column': column, 'Statistics': stat, 'p-value': p})
    else:
        kruskal_results.append({
            'Column': column, 
            'Statistics': None, 
            'p-value': None, 
            'Note': 'Insufficient valid groups (need at least 2)'
        })

for result in kruskal_results:
    print(f"Column: {result['Column']}, Statistics: {result['Statistics']}, p-value: {result['p-value']}")
    if 'Note' in result:
        print(f"  {result['Note']}")

额外说明

  • 改用filtered_data[column].unique()获取分组,保证只处理过滤后仍存在的有效类别。
  • 添加if not ...empty判断过滤空组,避免传入无数据的序列。
  • 增加组数量校验,不足2个时记录原因,替代无意义的NaN输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 08:12:18