如何将多个pandas DataFrame的t检验结果输出为DataFrame
多组DataFrame指定列t检验结果结构化实现
核心思路:保留原有双层遍历、t检验计算逻辑,不再直接逐行打印结果,而是将每次两两比较的四个字段值暂存到列表容器中,全部遍历完成后一次性转换为标准pandas DataFrame。
完整实现代码(兼容原有代码逻辑)
import pandas as pd from scipy.stats import ttest_ind # 原有获取变量名的函数可直接保留,以下为稳定实现参考 def retrieve_name(var): import inspect frame = inspect.currentframe().f_back return [var_name for var_name, var_val in frame.f_locals.items() if var_val is var][0] # 原有两个待比较的DataFrame列表无需修改 list1 = [a_apple, b_apple, c_apple, d_apple] list2 = [a_orange, b_orange, c_orange, d_orange] # 初始化空列表存储每一次检验的结果记录 result_records = [] # 原有双层循环逻辑 for df1 in list1: g1_name = retrieve_name(df1) for df2 in list2: g2_name = retrieve_name(df2) # 对count列执行独立样本t检验,若两组方差不齐可添加equal_var=False参数 t_stat, p_val = ttest_ind(df1['count'], df2['count']) # 将当前组结果追加到记录列表 result_records.append({ "group1": g1_name, "group2": g2_name, "statistics": t_stat, "pvalue": p_val }) # 转换为结构化DataFrame t_result_df = pd.DataFrame(result_records)
注意事项
- 若
count列存在空值,调用ttest_ind时添加nan_policy='omit'参数即可自动跳过空值,避免返回无效结果 - 若实验设计为配对样本,直接将
ttest_ind替换为ttest_rel即可,其余逻辑无需改动 - 独立样本t检验默认假设两组方差齐性,若方差不齐可添加
equal_var=False使用Welch's t检验
更稳定的写法(推荐)
依赖retrieve_name查找变量名的方式在代码运行环境变化时容易报错,推荐直接在列表中绑定组名和对应DataFrame,不需要额外写变量名查找函数:
import pandas as pd from scipy.stats import ttest_ind # 直接绑定组名和DataFrame list1 = [ ("a_apple", a_apple), ("b_apple", b_apple), ("c_apple", c_apple), ("d_apple", d_apple) ] list2 = [ ("a_orange", a_orange), ("b_orange", b_orange), ("c_orange", c_orange), ("d_orange", d_orange) ] result_records = [] for g1_name, df1 in list1: for g2_name, df2 in list2: t_stat, p_val = ttest_ind(df1['count'], df2['count']) result_records.append({ "group1": g1_name, "group2": g2_name, "statistics": t_stat, "pvalue": p_val }) t_result_df = pd.DataFrame(result_records)
最终生成的t_result_df完全符合要求的四字段结构,示例预览:
| group1 | group2 | statistics | pvalue |
|---|---|---|---|
| a_apple | a_orange | 1.372 | 0.173 |
| a_apple | b_orange | -0.842 | 0.402 |
| b_apple | a_orange | 2.105 | 0.038 |
| ... | ... | ... | ... |
内容的提问来源于stack exchange,提问作者nerd
相关产品推荐
相关产品推荐

