2016-09-09 149 views
0

我可以插入一列到數據幀即z得分這樣的另一列:添加分組逐zscore列到大熊貓數據幀

[1] df.insert(<loc>, column='ZofA', value=(df['A']-df['A'].mean())/df['A'].std()) 

我可以做一個簡單減少一列的2個分組其他列是這樣的:

[2] df.groupby(['C1', 'C2'])['A'].mean() 

我試圖取代簡單的平均數()函數[2]在zscore功能[1],但無法弄清楚如何做到這一點,包括使用。適用 - 例如這失敗了:

[3] df.groupby(['C1', 'C2']).apply((df['A']-df['A'].mean())/df['A'].std()) 

所以我的第一個問題是我顯然不知道如何創建一個zscore列與分組。我的第二個問題是,我想結合(1)將一個新列插入一個保存來自另一列('A')的z分數的數據框('ZofA'),(2)將這些zscores在由另外兩列('C1','C2')定義的組內計算。 (3)我想在一個df.insert()語句中完成所有這些。我只是搞亂了括號和括號,而不是,或者我想在一個聲明中做太多的事情?謝謝!

+1

通過本書做到:http://pandas.pydata.org/pandas-docs/stable/groupby.html您在文檔 – Boud

+0

中有確切的示例請將其作爲答案發布並標記爲正確解決了你的問題。 – ayhan

回答

3

感謝您指向文檔的指針。對於任何有好奇心的人,我都認爲我會發布解決方案。首先,將zscore計算放入一個lambda:

zscore = lambda x: (x - x.mean())/x.std() 

神奇的成分是.transform。只寫插入語句是這樣的:

df.insert(<loc>, 'ZofA', df.groupby(['C1', 'C2'])['A'].transform(zscore)) 

的解決方案確實是在「分組依據:分申請,合併」的文件。你只需要向下滾動到「轉換」部分。我忽略了有關日期鍵的內容,並將我的分組列直接插入groupby語句中。