Предположим, у меня есть следующий 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
Я бы хотел groupby
'id'
и агрегировать с помощью функции sum
над 'A'
, 'B'
. Но я также хотел бы масштабировать A и B на сумму A+B
(для каждого id), поэтому следующий результат будет выглядеть следующим образом:
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
Что довольно не элегантно . Есть ли способ поместить всю эту «скалярную» логику в функцию агрегирования? Или любой другой питонский и элегантный способ сделать это? Решения с участием numpy
также приветствуются!