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

如何对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生成所有不重复的两两组组合,再循环执行检验:

  1. 导入所需模块:
from itertools import combinations
from scipy import stats
  1. 提取分组对应的目标数据(将target_col替换为你实际要检验的列名):
# 把分组索引映射为对应的数据系列
group_data = {age: df.loc[idxs, 'target_col'] for age, idxs in all_groups.items()}
# 获取所有组的名称列表
group_names = list(group_data.keys())
  1. 遍历所有组合并执行检验:
# 生成所有无重复的两两组组合,逐个检验
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 10:32:05