如何对groupby分组后的所有两组组合应用stats.mannwhitneyu?
问题描述
我通过以下代码对数据按age列分组:
all_groups = df.groupby('age').groups
all_groups的输出结果为:
{1.0: [11, 14, 15, 22], 2.0: [12, 13, 27], 3.0: [16, 17, 19, 20, 23, 24], 6.0: [21], 7.0: [18, 25, 26], 11.0: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]}
现在我想对所有可能的两组组合运行stats.mannwhitneyu检验,本例中有6个组,共15种组合。需要一种通用实现方法,因为无法提前知晓组的数量,请问最简洁/巧妙的实现方式是什么?
解决方案
最简洁的实现方式是借助itertools.combinations生成所有不重复的两两组组合,再循环执行检验:
- 导入所需模块:
from itertools import combinations from scipy import stats
- 提取分组对应的目标数据(将
target_col替换为你实际要检验的列名):
# 把分组索引映射为对应的数据系列 group_data = {age: df.loc[idxs, 'target_col'] for age, idxs in all_groups.items()} # 获取所有组的名称列表 group_names = list(group_data.keys())
- 遍历所有组合并执行检验:
# 生成所有无重复的两两组组合,逐个检验 for group1, group2 in combinations(group_names, 2): stat, p_val = stats.mannwhitneyu(group_data[group1], group_data[group2]) # 按需调整结果输出格式 print(f"组{group1} vs 组{group2}: 统计量={stat:.2f}, p值={p_val:.4f}")
关键说明
combinations(group_names, 2)会自动生成所有不重复的两两组合,完全适配任意数量的分组,无需手动计算组合数。- 用字典推导式提前映射分组数据,避免每次检验重复从DataFrame取数,提升运行效率。
- 如果需要留存结果,可将统计量和p值存入列表或新的DataFrame,方便后续分析。
内容的提问来源于stack exchange,提问作者user3892
相关产品推荐
相关产品推荐

