如何在Python中对DataFrame数值列执行Kruskal和Dunn检验并导出结果
问题需求
现有名为df的DataFrame,包含Type列(取值为X、Y、Z)及column_1至column_84共84个数值列,需完成以下操作:
- 对每个数值列执行两类统计检验:
- Kruskal-Wallis检验:比较X、Y、Z三组的整体统计差异
- Dunn检验:完成X vs Y、Y vs Z、X vs Z的两两比较
- 将两类检验结果分别导出至Excel的
Kruskal工作表和Dunn工作表
完整解决方案
1. 安装依赖库
先安装所需的Python库:
pip install pandas numpy scipy scikit-posthocs openpyxl
2. 实现代码
import pandas as pd import numpy as np from scipy.stats import kruskal import scikit_posthocs as sp # 注:若无需测试,可注释掉下方生成df的代码(假设df已存在) # ---------------------- # 生成测试用DataFrame # df = pd.DataFrame( # data=np.random.uniform(low=5.5, high=30.75, size=(60, 84)), # columns=[f'column_{i}' for i in range(1, 85)], # ) # df.insert(loc=0, column='Type', value=np.repeat(['X','Y','Z'], 20, axis=0)) # ---------------------- # 初始化结果列表 kruskal_res = [] dunn_res = [] # 遍历所有数值列(跳过Type列) for col in df.columns[1:]: # 提取各组数据 group_x = df[df['Type'] == 'X'][col].values group_y = df[df['Type'] == 'Y'][col].values group_z = df[df['Type'] == 'Z'][col].values # Kruskal-Wallis检验 h_stat, p_val = kruskal(group_x, group_y, group_z) kruskal_res.append({ '列名': col, 'H统计量': round(h_stat, 4), 'P值': round(p_val, 6) }) # Dunn检验(Bonferroni校正) dunn_p = sp.posthoc_dunn([group_x, group_y, group_z], p_adjust='bonferroni') # 提取两两比较的P值 dunn_res.append({ '列名': col, 'X vs Y': round(dunn_p.iloc[0,1], 6), 'Y vs Z': round(dunn_p.iloc[1,2], 6), 'X vs Z': round(dunn_p.iloc[0,2], 6) }) # 转换为DataFrame kruskal_df = pd.DataFrame(kruskal_res) dunn_df = pd.DataFrame(dunn_res) # 导出到Excel with pd.ExcelWriter('统计检验结果.xlsx', engine='openpyxl') as writer: kruskal_df.to_excel(writer, sheet_name='Kruskal', index=False) dunn_df.to_excel(writer, sheet_name='Dunn', index=False) print("检验结果已成功导出至「统计检验结果.xlsx」")
代码说明
- 自动遍历所有84个数值列,批量完成两类检验
- Kruskal结果保留4位小数的H统计量和6位小数的P值,便于结果读取
- Dunn检验采用Bonferroni校正控制多重比较误差,直接提取三组两两对比的P值
- 导出的Excel文件包含两个工作表,分别对应两类检验结果,无冗余索引
内容的提问来源于stack exchange,提问作者RayX500
相关产品推荐
相关产品推荐

