使用Kruskal-Wallis检验始终得到NaN值的问题求助
Kruskal-Wallis检验返回NaN的原因与修复方案
问题根源
你的代码存在两个关键问题,导致检验结果全为NaN:
- 分组来源错误:你用
df[column].unique()获取分组类别,但这是原DataFrame的所有类别。经过dropna(subset=[column, 'age'])过滤后,部分类别可能已经没有有效数据(比如该类别下的age全是缺失值,被dropna彻底移除),导致生成的group_data里包含空的Series。 - 缺少有效组校验: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
相关产品推荐
相关产品推荐

