2012-05-25 102 views
42

我使用的是熊貓DataFrame做逐行t檢驗,按照本例:返回從熊貓多個值適用於數據幀

import numpy 
import pandas 

df = pandas.DataFrame(numpy.log2(numpy.randn(1000, 4), 
         columns=["a", "b", "c", "d"]) 

df = df.dropna() 

現在,假設我有「一」和「 b「作爲一個組,」c「和」d「在另一個組中,我正在按行進行t檢驗。這對大熊貓來說相當微不足道,使用apply和axis = 1。但是,如果我的函數沒有聚合,我可以返回相同形狀的DataFrame;如果聚合,我可以返回一個Series。

正常情況下,我只是輸出p值(所以,聚合),但我想生成基於其他計算(換句話說,返回兩個值)的附加值。我當然可以做兩次運行,首先彙總p值,然後再做其他工作,但我想知道是否有更高效的方式來處理數據,因爲數據相當大。

作爲計算的一個例子,一個hypotethical功能將是:

from scipy.stats import ttest_ind 

def t_test_and_mean(series, first, second): 
    first_group = series[first] 
    second_group = series[second] 
    _, pvalue = ttest_ind(first_group, second_group) 

    mean_ratio = second_group.mean()/first_group.mean() 

    return (pvalue, mean_ratio) 

然後用

df.apply(t_test_and_mean, first=["a", "b"], second=["c", "d"], axis=1) 

當然在這種情況下它返回與兩個元組作爲值的單個系列調用。

相反,ny預期的輸出將是一個DataFrame,它有兩列,一列用於第一個結果,另一列用於第二列。這是可能的,或者我必須爲兩次計算做兩次運行,然後將它們合併在一起?

+3

爲什麼您首先使用'apply'?你的結果是一個新的'DataFrame',它具有與輸入(行和列)不同的形狀,因此它是一個全新的obj。您可以讓't_test_and_mean'接受您的輸入數據框(以及要分組的列)並返回1行2列數據框,而不使用「apply」。 – lbolla

+1

@lbolla對,最終我在代碼中完成了這個工作。 – Einar

回答

59

返回一個Series而不是元組,應該產生一個新的多列DataFrame。例如,

return pandas.Series({'pvalue': pvalue, 'mean_ratio': mean_ratio}) 
+0

我會在星期一重試,但如果我記得正確,它會嘗試強制原始列結構(從而以NAs結束)。 – Einar

+0

@garrett - 如何確保從函數返回的seried將保留其「預期」的順序。我的用例是 - 從函數返回這個系列,我使用df.to_csv將它保存到一個csv文件。除了當然是愚蠢的,並將它們命名爲A,B,C,D以保留其在csv文件中的自然順序。 – ekta

+4

來指定列的順序,嘗試使用列表而不是字典來構造系列,例如:'pandas.Series([pvalue,mean_ratio],index = ['pvalue','mean_ratio'])' – Garrett