Groupby与重量

时间:2017-07-17 00:20:34

标签: python pandas group-by

鉴于以下数据框:

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

但是我想使用" Weight"用于对案例进行加权的列,使得前3行将计为0.5而不是1,最后两行将计为1.2。所以,如果按年龄和种族分组,我应该有以下内容:

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

这类似于使用"重量案例" SPSS中的选项。 我知道在R中它是可能的,我在Python中看到了一个很有前途的库(尽管当前的构建失败了)here

和PySal(不确定它是否适用于此处)

......但是我想知道它是否可以在分组中以某种方式完成。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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