2016-02-22 5 views
2

Я новичок в dataframes pandas и буду признателен за помощь в решении следующей проблемы (аналогично this). У меня есть следующие данные:pandas dataframe: подмножество по столбцу + группа по другому столбцу

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 для выполнения Стьюдента:

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

вы можете попробовать объединить на два ДФСЕ – galaxyan

+0

@galaxyan Не могли бы вы разработать то, что вы имеете в виду под этим? Благодаря! – Lisa

+0

http://pandas.pydata.org/pandas-docs/stable/merging.html это может помочь. – galaxyan

ответ

1

IIUC вы можете попробовать groupby по столбцам Cat2 и apply функции f:

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 
+0

Спасибо! Это работает, насколько я могу судить до сих пор! – Lisa

Смежные вопросы