2017-07-17 159 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