2015-04-06 114 views
0

我正在對熊貓數據框中的各種數據進行T檢驗。在多指標大熊貓數據框上執行T檢驗

我有這樣一個組織數據幀:(A,B等)

df = pd.DataFrame({'a': {('0hr', '0.01um', 0): 12, 
     ('0hr', '0.01um', 1): 10, 
     ('0hr', '0.1um', 0): 8, 
     ('0hr', '0.1um', 1): 6, 
     ('0hr', 'Control', 0): 4, 
     ('0hr', 'Control', 1): 2, 
     ('24hr', '0.01um', 0): 18, 
     ('24hr', '0.01um', 1): 15, 
     ('24hr', '0.1um', 0): 12, 
     ('24hr', '0.1um', 1): 9, 
     ('24hr', 'Control', 0): 6, 
     ('24hr', 'Control', 1): 3}, 
    'b': {('0hr', '0.01um', 0): 42, 
     ('0hr', '0.01um', 1): 35, 
     ('0hr', '0.1um', 0): 28, 
     ('0hr', '0.1um', 1): 21, 
     ('0hr', 'Control', 0): 14, 
     ('0hr', 'Control', 1): 7, 
     ('24hr', '0.01um', 0): 30, 
     ('24hr', '0.01um', 1): 25, 
     ('24hr', '0.1um', 0): 20, 
     ('24hr', '0.1um', 1): 15, 
     ('24hr', 'Control', 0): 10, 
     ('24hr', 'Control', 1): 5}}) 

打印(DF)

     a b 
    0hr 0.01um 0 12 42 
       1 10 35 
     0.1um 0 8 28 
       1 6 21 
     Control 0 4 14 
       1 2 7 
    24hr 0.01um 0 18 30 
       1 15 25 
     0.1um 0 12 20 
       1 9 15 
     Control 0 6 10 
       1 3 5 

對於每一列我想計算執行噸 - 將給定時間範圍內的控制與該時間範圍內的其他測試進行比較。

例如:

[t, prob] = stats.ttest_ind(df.loc['0hr'].loc['Control'] , df.loc['0hr'].loc['Control'], 1, equal_var=True) 
[t, prob] = stats.ttest_ind(df.loc['0hr'].loc['Control'] , df.loc['0hr'].loc['0.01um'], 1, equal_var=True) 
[t, prob] = stats.ttest_ind(df.loc['0hr'].loc['Control'] , df.loc['0hr'].loc['0.1um'], 1, equal_var=True) 
[t, prob] = stats.ttest_ind(df.loc['24hr'].loc['Control'] , df.loc['24hr'].loc['Control'], 1, equal_var=True) 
[t, prob] = stats.ttest_ind(df.loc['24hr'].loc['Control'] , df.loc['24hr'].loc['0.01um'], 1, equal_var=True) 
[t, prob] = stats.ttest_ind(df.loc['24hr'].loc['Control'] , df.loc['24hr'].loc['0.1um'], 1, equal_var=True) 

我一直在試圖與df.apply這樣做,但我不知道正確的語法是什麼。我想結果返回到結構像一個新的數據框:

results = pd.DataFrame({'a': {('0hr', '0.01um', 't'): '-', 
    ('0hr', '0.01um', 'prob'): '-', 
    ('0hr', '0.1um', 't'): '-', 
    ('0hr', '0.1um', 'prob'): '-', 
    ('0hr', 'Control', 't'): '-', 
    ('0hr', 'Control', 'prob'): '-', 
    ('24hr', '0.01um', 't'): '-', 
    ('24hr', '0.01um', 'prob'): '-', 
    ('24hr', '0.1um', 't'): '-', 
    ('24hr', '0.1um', 'prob'): '-', 
    ('24hr', 'Control', 't'): '-', 
    ('24hr', 'Control', 'prob'): '-'}, 
'b': {('0hr', '0.01um', 't'): '-', 
    ('0hr', '0.01um', 'prob'): '-', 
    ('0hr', '0.1um', 't'): '-', 
    ('0hr', '0.1um', 'prob'): '-', 
    ('0hr', 'Control', 't'): '-', 
    ('0hr', 'Control', 'prob'): '-', 
    ('24hr', '0.01um', 't'): '-', 
    ('24hr', '0.01um', 'prob'): '-', 
    ('24hr', '0.1um', 't'): '-', 
    ('24hr', '0.1um', 'prob'): '-', 
    ('24hr', 'Control', 't'): '-', 
    ('24hr', 'Control', 'prob'): '-'}}) 
+0

您是否考慮過使用anova測試?這對於幾個樣本來說是完全的t檢驗(很容易找到,例如在維基百科中)。我已經爲您提供的數據集運行它,結果是至少有一個樣本不同。然後你運行tukey的HSD來知道它是哪一個(一個或多個)。這我也試過了,但老實說,我無法正確對待你的multiindex。它會給你一個很好的清單,哪些樣品是不同的,哪些不是。你真的需要在你的問題中提出的格式的結果? – lrnzcig

+0

我對結果的格式很開放,但我相信我需要一個t檢驗。這不是我的實驗數據,所以我提供了所要求的... 2尾獨立t檢驗。我需要報告p值。這對我來說似乎是有意義的,因爲在任何給定時間只有兩個數據集被比較(例如,0.01um與控制或者0.1um與控制)。據我所知,方差分析是用於比較多個數據集。 – agf1997

+0

關鍵是我不認爲我已經理解了,對不起。好的,沒有ANOVA。但是,那麼你會運行24x2的t檢驗?也許我還是沒有明白......無論如何,如果你想將一個值應用於多指數,那就像'df.loc ['0hr']。loc ['0.01um'] ['t'] = xxx',假設't'是一列。對於你的數據框,我試過直接在ipython中作爲'df.loc ['0hr']。loc ['0.01um']。loc [0] ['a'] = 3'。但如果我還沒有明白,就告訴我! – lrnzcig

回答

0

好,不能完全肯定,我已經瞭解的情況,但我認爲這將是處理多指標的方式。

In [195]: 

index = pd.MultiIndex.from_product([set(df.index.get_level_values(0)), set(df.index.get_level_values(1)), ['t', 'p']]) 
result = pd.DataFrame(columns=['a', 'b'], index=index) 

for time in set(df.index.get_level_values(0)): 
    for condition in set(df.index.get_level_values(1)) - set(['Control']): 
     t, p = stats.ttest_ind(df.loc[time].loc['Control'] , df.loc[time].loc[condition], 1, equal_var=True) 
     result.loc[(time, condition, 't')] = t 
     result.loc[(time, condition, 'p')] = p 
print result 

而結果:

     a   b 
0hr Control t  NaN   NaN 
      p  NaN   NaN 
    0.01um t -0.6706134 -1.412036 
      p 0.5715365 0.2934382 
    0.1um t -0.8049845 -1.13842 
      p 0.5053153 0.3729403 
24hr Control t  NaN   NaN 
      p  NaN   NaN 
    0.01um t -2.529822 -3.137858 
      p 0.1271284 0.08831539 
    0.1um t -1.788854 -2.529822 
      p 0.2155355 0.1271284 

你可以在控制線隨便填,如果你需要,但就像你說的結果是可想而知的。

無論如何希望它有幫助。