Pandas - 按多列求和进行分组、聚合和缩放

3
假设我有以下DataFrame:
import pandas as pd
df = pd.DataFrame({'id': [1, 2, 2, 3, 3, 3], 'A': [2, 2, 3, 3, 5, 2], 'B': [1, 2, 1, 3, 2, 4]})
df
Out[253]: 
   id  A  B
0   1  2  1
1   2  2  2
2   2  3  1
3   3  3  3
4   3  5  2
5   3  2  4

我想通过'id'进行分组,并使用sum函数对'A''B'进行聚合。但是我还想按每个'id'的A+B总和来缩放A和B。因此,以下输出将如下所示:

   id         A         B
0   1  0.666667  0.333333
1   2  0.625000  0.375000
2   3  0.526316  0.473684

现在,我可以做

res = df.groupby('id').agg('sum').reset_index()
scaler = res['A'] + res['B']
res['A'] /= scaler
res['B'] /= scaler
res
Out[275]: 
   id         A         B
0   1  0.666667  0.333333
1   2  0.625000  0.375000
2   3  0.526316  0.473684

这种方法相当不优雅。有没有一种方法可以将所有这些“标量”逻辑放入聚合函数中?或者有其他Pythonic和优雅的方法来实现它?涉及numpy的解决方案也是可以接受的!

3个回答

4

不可以使用 agg 函数进行缩放,因为它是单独处理每一列的。

解决方法是在除法 (div) 中,移除 reset_index 以对齐由 sum 创建的 Series

res = df.groupby('id').sum()
res = res.div(res.sum(axis=1), axis=0).reset_index()
print (res)
   id         A         B
0   1  0.666667  0.333333
1   2  0.625000  0.375000
2   3  0.526316  0.473684

细节:

print (res.sum(axis=1))
id
1     3
2     8
3    19
dtype: int64

3
您可以沿第一个轴使用sum
res = df.groupby('id').agg('sum')
res.div(res.sum(1), 0)

           A         B
id
1   0.666667  0.333333
2   0.625000  0.375000
3   0.526316  0.473684

3
您可以这样做。
In [584]: res = df.groupby('id').sum()

In [585]: res.div(res.sum(1), 0).reset_index()
Out[585]:
   id         A         B
0   1  0.666667  0.333333
1   2  0.625000  0.375000
2   3  0.526316  0.473684

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接