[我尝试了几个小时,并陷入了这个问题,如何应用自定义函数计算从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值,并认为也许我可以从...获得一些帮助?
您可以这样做:
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)