熊猫GROUPBY体重
问题描述:
鉴于以下数据框:熊猫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(如果不知道它的适用在这里)
......但我想知道是否可以在小组中以某种方式完成。
提前致谢!
答
如果我理解正确,你只是在寻找.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
答
不完全是显而易见的......但一个有趣的方式与pd.factorize
和np.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
由于这样做,@米奇!那是在我的鼻子下面。 –
@DanceParty欢迎您! – miradulo