t 测试 groupby pandas 之后的多列

Posted

技术标签:

【中文标题】t 测试 groupby pandas 之后的多列【英文标题】:t test for multiple columns after groupby pandas 【发布时间】:2020-03-04 13:19:09 【问题描述】:

我想计算和测试 pandas 中两组不同的多列的平均值,我可以计算出计算部分,但测试部分到目前为止还没有好的解决方案。下面是一个玩具样品和我想要的结果。

df = pd.DataFrame(np.random.randint(0,100,size=(100, 2)), columns=['col_1','col_2'])
df['group'] = ['A']*50 + ['B']*50

df.groupby('group').agg("col_1":"mean","col_2":"mean")

       col_1  col_2
group              
A      52.26  56.58
B      53.04  49.18

我想拥有什么:

       col_1  t_col_1  col_2 t_col_2
group              
A      52.26  4.3***   56.58 0.8
B      53.04  4.3***   49.18 0.8

其中t_col_1是A组和B组col_1的均值差的t个统计量,即t.test(df.loc[df['group'].isin(['B'])][col_1], df.loc[df['group'].isin(['A'])][col_1])。星星不是必需的,但如果它们能在那里就很棒了。

关于如何做到这一点的任何建议?

【问题讨论】:

***.com/questions/13404468/t-test-in-pandas 是否应该对整个人群进行t检验,即之前 groupby? A groupby.agg 在这里不会很好,因为它将 DataFrame 划分为单独的组,然后对每个组进行计算。两个样本 t 检验要求您将多个组发送到函数中,尽管我猜 groupby 至少会为您分隔每个组。 【参考方案1】:

您可以遍历列并按您的组执行 t 检验:

import pandas as pd
import scipy.stats as stats

tstats = 
ix_a = df['group'] == 'A'
for x in df:
    if x != 'group':
        tstats['t_' + x] = stats.ttest_ind(df[x][ix_a], df[x][~ix_a])[0]

df.groupby('group').mean().assign(**tstats)

结果:

       col_1  col_2  t_col_1   t_col_2
group                                 
A      56.24  46.84  0.85443 -0.281279
B      51.24  48.42  0.85443 -0.281279

【讨论】:

以上是关于t 测试 groupby pandas 之后的多列的主要内容,如果未能解决你的问题,请参考以下文章

Pandas Groupby 独特的多列

使用多列的 Pandas groupby 函数

pandas groupby 聚合具有多列的自定义函数

pandas pivot 或 groupby 多列和控制列

Pandas 一次缩放多列并使用 groupby() 进行逆变换

具有多列的groupby,在pandas中具有添加和频率计数[重复]