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

如何自动对DataFrame中各变量分组执行T检验并生成p值结果表?

自动计算分组变量的T检验P值

原始数据

首先定义示例DataFrame:

import pandas as pd
import numpy as np
from scipy.stats import ttest_ind

features_df = pd.DataFrame({
    'group': np.array([0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1]),
    'variable': ['var1'] * 8 + ['var2'] * 8,
    'value': np.array([5.582443, 7.855871, 9.843828, 8.331354, 1.593624, 2.151113, 1.403245, 3.495429,
                         5.361531, 6.739888, 4.120531, 9.931341, 1.121117, 0.730207, 0.931132, 3.001303])
})

DataFrame内容如下:

group variable     value
0      0     var1  5.582443
1      0     var1  7.855871
2      0     var1  9.843828
3      0     var1  8.331354
4      1     var1  1.593624
5      1     var1  2.151113
6      1     var1  1.403245
7      1     var1  3.495429
8      0     var2  5.361531
9      0     var2  6.739888
10     0     var2  4.120531
11     0     var2  9.931341
12     1     var2  1.121117
13     1     var2  0.730207
14     1     var2  0.931132
15     1     var2  3.001303

手动计算方式

如果逐个变量手动计算组间T检验P值,代码如下:

# 提取var1的两组数据
var1_0 = features_df.query('variable == "var1" & group == 0').value.values
var1_1 = features_df.query('variable == "var1" & group == 1').value.values

# 提取var2的两组数据
var2_0 = features_df.query('variable == "var2" & group == 0').value.values
var2_1 = features_df.query('variable == "var2" & group == 1').value.values

# 计算P值
var1_pvalue = ttest_ind(var1_0, var1_1)[1]
# 输出:0.0012163722443546759

var2_pvalue = ttest_ind(var2_0, var2_1)[1]
# 输出:0.00946879342461542

需求

需要自动为所有变量生成如下格式的结果DataFrame:

variables  ttest_pvalue
0      var1      0.001216
1      var2      0.009469

自动化解决方案

方法一:groupby结合自定义函数

通过按variable分组,对每个分组执行T检验计算:

def calculate_ttest_pvalue(group):
    # 拆分当前变量的组0和组1数据
    group0 = group[group['group'] == 0]['value']
    group1 = group[group['group'] == 1]['value']
    # 返回独立样本T检验的P值
    return ttest_ind(group0, group1)[1]

# 分组计算并整理结果
result_df = features_df.groupby('variable').apply(calculate_ttest_pvalue).reset_index()
# 修改列名匹配需求
result_df.columns = ['variables', 'ttest_pvalue']
# 保留6位小数
result_df['ttest_pvalue'] = result_df['ttest_pvalue'].round(6)

print(result_df)

输出结果:

variables  ttest_pvalue
0      var1      0.001216
1      var2      0.009469

方法二:透视表遍历计算

先将数据转为宽表格式,再遍历每个变量列计算P值:

# 透视数据:行是变量,列是分组,值为对应样本数据
pivot_df = features_df.pivot(index='variable', columns='group', values='value')

# 对每个变量计算组间T检验P值
result_df = pivot_df.apply(lambda x: ttest_ind(x[0], x[1])[1], axis=1).reset_index()
result_df.columns = ['variables', 'ttest_pvalue']
result_df['ttest_pvalue'] = result_df['ttest_pvalue'].round(6)

print(result_df)

该方法同样能得到目标结果。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 05:27:18