2017-10-15 88 views
0

我想在電子表格中執行一些看起來很容易的事情,但我無法在熊貓中找到語法。我有一個可以分組的數據集。我想確定每個組的聚合統計信息,但是然後使用聚合在原始數據框中創建一個新列。使用熊貓將聚合應用到原始數據框中

例如,如果我的數據幀是這樣的:

d = pandas.dataframe({'class', : ['f1', 'f2', 'f3', 'f1'], 
'user': ['jack', 'jen', 'joe', 'jan'], 
'screen': [12, 23, 13, 15] }) 

是它比我的數據集

我想這樣做

d['gp'] = d['screen'].apply(d.groupby('class').stdev()) 

,並保證要小得多d.groupby()。stdev()實際上是該行的該類的stdev。換句話說,我不想在計算類f2的gp時使用類f1的stdev。

我的大腦正在以電子表格模式或python for循環思考。我知道必須有一個簡單的熊貓語法才能做到這一點 - 但到目前爲止,我沒有在我的搜索中找到任何似乎符合我的用例的東西。

回答

1

看來你需要transform與相同長度的原始Dataframe回報Series

d['gp'] = d.groupby('class')['screen'].transform('std') 
print (d) 
    class screen user  gp 
0 f1  12 jack 2.12132 
1 f2  23 jen  NaN 
2 f3  13 joe  NaN 
3 f1  15 jan 2.12132 

你得到NaN S,因爲一些羣體(f2f3)具有長度等於1

+1

沒錯。我有我的信 – Dark

+0

不一樣的信。我需要將聚合操作應用於原始數據框。但每個同意op(平均值,標準開發)必須爲每個組計算 - 因此該組按 –

+0

您是否需要'd ['screengrade'] = d.groupby('class')['screen']。transform lambda x:x /(x.std()+ x.mean())* 200)'?我只用手機,所以未經測試。 – jezrael

0

我我在這方面做了一些工作,並希望在定義我想要的東西時更精確一些。在我的數據集中,我有3組類。我想確定每個班級的綜合統計數據;意思是說,std dev。因此,如果我在字典列表中使用pythonish僞代碼,它看起來像這樣:

groupamean = mean(groupa ['screens']的列表) groupastddev = stddev(groupa ['screens '])

對於p在A組: x.append = A組[' 屏幕] * groupamean + groupastdev

這將被重複用於每個組。這是普通Python引導我思考的方式。

大熊貓與數據框對象邀請一種新的思維方式。它不需要使用for循環來完成一系列的事情。但我不知道如何確保在應用groupby生成的聚合函數時,我可以得到正確的組。

似乎親近的語法是這樣的

d['screengrade']= d['Screens Typed'].apply(lambda x: x/(classgroups.std + classgroups.mean) * 200) 

但是,這將引發一個類型錯誤。

+0

越來越接近TypeError,因爲classgroups.std是一個函數,我應該調用它 - –