2016-02-22 114 views
2

我是熊貓數據框新手,希望對以下問題的幫助(類似於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) 

我想在Cat2執行ttest_ind每一個類別中Cat1類別之間進行區分。

我看到它的方式,我可以將數據通過Cat2每個值分成

cat1_1 = my_data[my_data['Cat1']==1] 
cat1_2 = my_data[my_data['Cat1']==2] 

然後循環執行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

你可以嘗試在兩個DFS合併 – galaxyan

+0

@galaxyan你可否透露您的意思嗎?謝謝! – Lisa

+0

http://pandas.pydata.org/pandas-docs/stable/merging.html它可能有幫助。 – galaxyan

回答

1

IIUC您可以通過Cat2柱和apply功能f嘗試groupby

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