在Pandas中按子组逐次执行t-test并添加结果至原DataFrame
规范实现方案
前提假设
假设你的DataFrame包含三列:
key:分组标识(如A1、A2)group:子组编号(需为可排序类型,如整数1、2、3)value:待检验的数值列
实现步骤
- 导入依赖库:
import pandas as pd import numpy as np from scipy.stats import ttest_ind
- 构造示例数据(可替换为你的真实数据):
np.random.seed(42) keys = ['A1', 'A1', 'A1', 'A2', 'A2'] groups = [1,2,3,1,2] values = np.concatenate([ np.random.normal(5, 1, 40), np.random.normal(6, 1, 40), np.random.normal(5.5, 1, 40), np.random.normal(7, 1, 40), np.random.normal(7.2, 1, 40) ]) df = pd.DataFrame({'key': keys, 'group': groups, 'value': values})
- 定义连续子组t检验函数:
def compute_continuous_ttests(group_df): # 按子组排序,保证连续对比的顺序正确 sorted_groups = group_df.groupby('group')['value'].apply(list).sort_index() test_results = [] # 遍历所有连续子组对 for i in range(len(sorted_groups) - 1): group1_data = sorted_groups.iloc[i] group2_data = sorted_groups.iloc[i+1] # 独立样本t检验(方差齐性设为True,不齐则改为False) t_stat, p_val = ttest_ind(group1_data, group2_data, equal_var=True) test_results.append({ 'key': group_df['key'].iloc[0], 'group_pair': f"{sorted_groups.index[i]} vs {sorted_groups.index[i+1]}", 't_statistic': t_stat, 'p_value': p_val }) return pd.DataFrame(test_results)
- 执行分组检验并得到结果:
ttest_summary = df.groupby('key').apply(compute_continuous_ttests).reset_index(drop=True)
此时ttest_summary会输出每个key下所有连续子组对的检验结果,格式示例:
| key | group_pair | t_statistic | p_value |
|---|---|---|---|
| A1 | 1 vs 2 | -6.09 | 1.2e-08 |
| A1 | 2 vs 3 | 2.78 | 0.006 |
| A2 | 1 vs 2 | -1.12 | 0.26 |
- 将p值关联回原DataFrame:
如果需要给原DataFrame添加一列,标记当前子组与下一个子组的检验p值,可以通过映射字典实现:
# 构建key+group到p值的映射 p_mapping = {} for _, row in ttest_summary.iterrows(): g1, g2 = map(int, row['group_pair'].split(' vs ')) p_mapping[(row['key'], g1)] = row['p_value'] # 给每个key的最后一个子组设置NaN(无后续子组可对比) for key in df['key'].unique(): max_group = df[df['key'] == key]['group'].max() p_mapping[(key, max_group)] = np.nan # 添加新列到原DataFrame df['p_value_vs_next_group'] = df.apply(lambda x: p_mapping[(x['key'], x['group'])], axis=1)
关键说明
- 用
groupby.apply替代显式循环,更符合Pandas的向量化编程风格,代码简洁且易维护 - 自动适配每个key下的子组数量,无需手动指定对比次数
- 因每组观测数>30,中心极限定理保证t检验结果可靠;若方差不齐,修改
ttest_ind的equal_var参数为False即可 - 原DataFrame中最后一个子组的
p_value_vs_next_group设为NaN,符合无后续对比的逻辑
内容的提问来源于stack exchange,提问作者Anubhav Dikshit
相关产品推荐
相关产品推荐

