我是pandas数据框架的新手,非常感谢您解决以下问题(类似于this)。我有以下数据:
data = {'Cat1': [2,1,2,1,2,1,2,1,1,1,2],
'Cat2': [0,0,0,0,0,0,1,1,1,1,1],
'values': [1,2,3,1,2,3,1,2,3,5,1]}
my_data = DataFrame(data)
我想对ttest_ind
中的每个类别执行Cat2
,以区分Cat1
中的类别。
我看到它的方式,我可以将数据分成
cat1_1 = my_data[my_data['Cat1']==1]
cat1_2 = my_data[my_data['Cat1']==2]
然后循环遍历Cat2
中的每个值以执行t检验:
for cat2 in [0,1]:
subset_1 = cat1_1[cat1_1['Cat2']==cat2]
subset_2 = cat1_2[cat1_2['Cat2']==cat2]
t, p = ttest_ind(subset_1['values'], subset_2['values'])
但这看起来真的很复杂。可能有一个更简单的解决方案,可能是groupby
?非常感谢!
答案 0 :(得分:1)
IIUC您可以按Cat2
列和groupby
函数f
尝试apply
:
import pandas as pd
from scipy.stats import ttest_ind
data = {'Cat1': [2,1,2,1,2,1,2,1,1,1,2],
'Cat2': [0,0,0,0,0,0,1,1,1,1,1],
'values': [1,2,3,1,2,3,1,2,3,5,1]}
my_data =pd.DataFrame(data)
print my_data
Cat1 Cat2 values
0 2 0 1
1 1 0 2
2 2 0 3
3 1 0 1
4 2 0 2
5 1 0 3
6 2 1 1
7 1 1 2
8 1 1 3
9 1 1 5
10 2 1 1
def f(x):
#print x
cat1_1 = x[x['Cat1']==1]
cat1_2 = x[x['Cat1']==2]
t, p = ttest_ind(cat1_1['values'], cat1_2['values'])
return pd.Series({'a':t, 'b':p})
print my_data.groupby('Cat2').apply(f)
a b
Cat2
0 0.00000 1.000000
1 2.04939 0.132842