如何在大熊猫的groupby之后获得两组之间的p值?

问题描述 投票:2回答:1

[我尝试了几个小时,并陷入了这个问题,如何应用自定义函数计算从pandas groupby获得的两个组的p值,并认为也许我可以从stackoverflow老兵那里得到一些帮助。

词汇

test = 0 ==> test
test = 1 ==> control

问题设置

import numpy as np
import pandas as pd
import scipy.stats as ss

np.random.seed(100)
N = 15
df = pd.DataFrame({'country': np.random.choice(['A','B','C'],N),
                   'test': np.random.choice([0,1], N),
                   'conversion': np.random.choice([0,1], N),
                   'sex': np.random.choice(['M','F'], N)

                  })


ans = df.groupby(['country','test'])['conversion'].agg(['size','mean']).unstack('test')
ans.columns = ['test_size','control_size','test_mean','control_mean']
         test_size  control_size  test_mean  control_mean
country                                                  
A                3             3   0.666667      0.666667
B                1             1   1.000000      1.000000
C                4             3   0.750000      1.000000

问题

现在,我想再添加两列以获取测试组和对照组之间的p值。但是在我的groupby中,我一次只能操作一个序列,而且我不确定如何使用两个序列来获得p值。

到目前为止已完成:

def get_ttest(x,y):
    return stats.ttest_ind(x, y, equal_var=False).pvalue

pseudo code:

df.groupby(['country','test'])['conversion'].agg(
['size','mean', some_function_to_get_pvalue])

如何获取p值列?

必填]

我需要获取列pvalue的值]

         test_size  control_size  test_mean  control_mean  pvalue
country                                                  
A                3             3   0.666667      0.666667   ?
B                1             1   1.000000      1.000000   ?
C                4             3   0.750000      1.000000   ?

我尝试了几个小时,并陷入了这个问题,如何应用自定义函数来计算从pandas groupby获得的两个组的p值,并认为也许我可以从...获得一些帮助?

python pandas numpy scipy p-value
1个回答
1
投票

您可以这样做:

import numpy as np
import pandas as pd
import scipy.stats as stats

def get_ttest(x,y):
    return stats.ttest_ind(x, y, equal_var=False).pvalue

np.random.seed(100)
N = 15
df = pd.DataFrame({'country': np.random.choice(['A','B','C'],N),
                   'test': np.random.choice([0,1], N),
                   'conversion': np.random.choice([0,1], N),
                   'sex': np.random.choice(['M','F'], N)

                  })


ans = df.groupby(['country','test'])['conversion'].agg(['size','mean']).unstack('test')
ans.columns = ['test_size','control_size','test_mean','control_mean']

ans['pvalue'] = df.groupby('country').apply(lambda dfx: get_ttest(
    dfx.loc[dfx.test == 0,'conversion'],
    dfx.loc[dfx.test ==1, 'conversion']))

print(ans)
© www.soinside.com 2019 - 2024. All rights reserved.