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

在Pandas中按子组逐次执行t-test并添加结果至原DataFrame

规范实现方案

前提假设

假设你的DataFrame包含三列:

  • key:分组标识(如A1、A2)
  • group:子组编号(需为可排序类型,如整数1、2、3)
  • value:待检验的数值列

实现步骤

  1. 导入依赖库:
import pandas as pd
import numpy as np
from scipy.stats import ttest_ind
  1. 构造示例数据(可替换为你的真实数据):
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})
  1. 定义连续子组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)
  1. 执行分组检验并得到结果:
ttest_summary = df.groupby('key').apply(compute_continuous_ttests).reset_index(drop=True)

此时ttest_summary会输出每个key下所有连续子组对的检验结果,格式示例:

keygroup_pairt_statisticp_value
A11 vs 2-6.091.2e-08
A12 vs 32.780.006
A21 vs 2-1.120.26
  1. 将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 14:45:35