如何自动对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
相关产品推荐
相关产品推荐

