У меня есть таблица, в которой некоторые значения относятся к индексу, а некоторые другие относятся к повторным значениям.В примере sid
является индексом, стоит sid, но один sid может содержать много транзакций, и даже больше, одна транзакция может содержать много категорий.
df = pd.DataFrame([
[1, 100, 1, 'A', 1, 50, 2],
[1, 100, 2, 'A', 1, 50, 1],
[1, 100, 2, 'B', 2, 100, 1],
[1, 100, 2, 'C', 3, 50, 1],
[2, 200, 3, 'D', 4, 500, 1],
[2, 200, 4, 'C', 2, 100, 1],
[3, 200, 5, 'B', 2, 100, 1],
[3, 200, 5, 'A', 1, 50, 1],
[3, 200, 5, 'A', 3, 50, 1]
], columns=['sid', 'costs', 'transaction_id', 'category', 'sku', 'price', 'quantity'])
df['revenue'] = df['price'] * df['quantity']
Так что, если посмотреть на уровень sid, мне нужно сначала взятьстоимость затрат и сумма выручки.Вот как это должно выглядеть.Общие затраты - 500, общий доход - 1100.
df.groupby('sid').agg({'costs': 'min', 'revenue':'sum'}).pivot_table(index='sid', margins=True, aggfunc='sum')
Но я хочу разложить sid по категориям.Я могу сделать это таким образом.
df.groupby(['sid', 'category']).agg({'costs': 'min', 'revenue':'sum'}).pivot_table(index=['sid', 'category'], aggfunc='sum', margins=True)
Моя проблема заключается в том, что для каждой строки затраты были дублированы.И сумма расходов составляет 1100, что не соответствует действительности.Я хочу в равной степени сократить расходы по количеству категорий в каждом sid.Таким образом, это будет выглядеть как
Возможно ли применить такую функцию прокатки?