2017-07-17 185 views
2

鑑於以下數據框:熊貓GROUPBY體重

import pandas as pd 
d=pd.DataFrame({'Age':[18,20,20,56,56],'Race':['A','A','A','B','B'],'Response':[3,2,5,6,2],'Weight':[0.5,0.5,0.5,1.2,1.2]}) 
d 
    Age  Race Response Weight 
0 18  A  3   0.5 
1 20  A  2   0.5 
2 20  A  5   0.5 
3 56  B  6   1.2 
4 56  B  2   1.2 

我知道我可以通過組應用度日年齡和種族這樣的計數:

d.groupby(['Age','Race'])['Response'].count() 
Age Race 
18 A  1 
20 A  2 
56 B  2 
Name: Response, dtype: int64 

但我d喜歡使用「權重」列對案例進行加權,使前3行將計爲0.5而不是1,最後兩行將計爲1.2。所以,如果按年齡和種族劃分,我應該有以下幾點:

Age Race 
18 A  0.5 
20 A  1 
56 B  2.4 
Name: Response, dtype: int64 

這與使用SPSS中的「Weight Cases」選項類似。 我知道這是可能的R和我見過的Python有前途的庫(雖然當前編譯失敗)位置:

https://github.com/InContextSolutions/PandaSurvey

和PySal(如果不知道它的適用在這裏)

......但我想知道是否可以在小組中以某種方式完成。

提前致謝!

回答

3

如果我理解正確,你只是在尋找.sum()的權重。

d.groupby(['Age', 'Race']).Weight.sum() 

## Age Race 
## 18 A  0.5 
## 20 A  1.0 
## 56 B  2.4 
## Name: Weight, dtype: float64 
+0

由於這樣做,@米奇!那是在我的鼻子下面。 –

+0

@DanceParty歡迎您! – miradulo

2

不完全是顯而易見的......但一個有趣的方式與pd.factorizenp.bincount

f, u = pd.factorize(
    [tuple(row) for row in d[['Age', 'Race']].values.tolist()] 
) 

pd.Series(
    np.bincount(f, d.Weight.values), 
    pd.MultiIndex.from_tuples(u, names=['Age', 'Race']) 
) 

Age Race 
18 A  0.5 
20 A  1.0 
56 B  2.4 
dtype: float64 
+1

「不完全明顯」可能是_slight_輕描淡寫;)但這是整潔。 – miradulo