2017-09-07 73 views
0

我想在multiindex數據框(基本上是groupby描述數據框)上應用一個函數,而不使用for循環遍歷0級索引。pandas在multiindex上應用函數

功能我想申請:我的數據幀的

def CI(x): 
    import math 
    sigma = x["std"] 
    n = x["count"] 
    return 1.96 * sigma/math.sqrt(n) 

樣品:

df = df.iloc[47:52, [3,4,-1]] 

       a   b     id 
47   0.218182 0.000000 0d1974107c6731989c762e96def73568 
48   0.000000 0.000000 0d1974107c6731989c762e96def73568 
49   0.218182 0.130909 0d1974107c6731989c762e96def73568 
50   0.000000 0.000000 0fd4f3b4adf43682f08e693a905b7432 
51   0.000000 0.000000 0fd4f3b4adf43682f08e693a905b7432 

,我和楠取代零:

df = df.replace(float(0), np.nan) 

Groupy的ID和描述我得到了multiindex:

df_group = df.groupby("id").describe() 

當前的解決方案,我不喜歡,認爲可以改進:

l_df = [] 
for column in df_group.columns.levels[0]: 
    df = pd.DataFrame({"CI" : df_group[column].apply(CI, axis = 1)}) 
    l_df.append(df) 
CI = pd.concat(l_df, axis = 1) 
CI.columns = df_group.columns.levels[0] 

,所以我得到這樣的:

        a  b 
id 
06f32e6e45da385834dac983256d59f3 nan  nan 
0d1974107c6731989c762e96def73568 0.005 0.225 
0fd4f3b4adf43682f08e693a905b7432 0.008 nan 
11e0057cdc8b8e1b1cdabfa8a092ea5f 0.018 0.582 
120549af6977623bd01d77135a91a523 0.008 0.204 

如此反覆,如果我有頂級列從A到Z ,並且每個都包含std和count列,那麼如何將我的函數同時應用於這些列?

+0

謝謝約翰答覆。這是更短的解決方案,但原則上它只是重新解釋我的解決方案。我想知道在熊貓中是否有一種方法可以在多指標級別上運行,而不需要循環或列表解析。 – LostBoardOnTaurangaBeach

+0

天才!這是我正在尋找的答案。你以爲我多次執行groupby是正常的,並且你認爲我如何遞歸地使用lambda。非常感激!您應該發佈答案,以便我可以獎勵您的積分(如果我理解獎勵系統正確 - 我是新的) – LostBoardOnTaurangaBeach

+0

已添加爲答案。 – Zero

回答

1

level上使用groupbyaxis=1,讓我們迭代並應用於第一級列。

In [104]: (df.groupby("id").describe() 
      .groupby(level=0, axis=1) 
      .apply(lambda x: x[x.name].apply(CI, axis=1))) 
Out[104]: 
            a b 
id 
0d1974107c6731989c762e96def73568 0.0 NaN 
0fd4f3b4adf43682f08e693a905b7432 NaN NaN 

逸岸,你不需要CI,如果你要

In [105]: (df.groupby("id").describe() 
      .groupby(level=0, axis=1).apply(lambda x: x[x.name] 
      .apply(lambda x: 1.96*x['std']/np.sqrt(x['count']), axis=1))) 
Out[105]: 
            a b 
id 
0d1974107c6731989c762e96def73568 0.0 NaN 
0fd4f3b4adf43682f08e693a905b7432 NaN NaN 

樣品df

In [106]: df 
Out[106]: 
      a   b        id 
47 0.218182  NaN 0d1974107c6731989c762e96def73568 
48  NaN  NaN 0d1974107c6731989c762e96def73568 
49 0.218182 0.130909 0d1974107c6731989c762e96def73568 
50  NaN  NaN 0fd4f3b4adf43682f08e693a905b7432 
51  NaN  NaN 0fd4f3b4adf43682f08e693a905b7432 
+0

謝謝你的回答。我可以問你如何將結果打印到計算器上,因爲當我試圖從jupyter筆記本上覆制格式時,我就不得不手動修改一些內容。 – LostBoardOnTaurangaBeach

+0

閱讀https://meta.stackexchange.com/questions/216464/how-to-insert-code-properly-on-stack-overflow和https://stackoverflow.com/questions/20109391/how-to-make-良好的重現 - 大熊貓,實例 – Zero

相關問題