pandas dataframe:按列+ groupby的子集

时间:2016-02-22 18:24:52

标签: python pandas

我是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?非常感谢!

1 个答案:

答案 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