сводная таблица python / group by - мне нужно знать топ 3 группы - PullRequest
0 голосов
/ 22 ноября 2018
import pandas as pd

df = pd.DataFrame({
       'customer': [1,2,1,3,1,2,3],
       "group_code": ['111', '111', '222', '111', '111', '111', '333'],
       "ind_code": ['A', 'B', 'AA', 'A', 'AAA', 'C', 'BBB'],
       "amount": [100, 200, 140, 400, 225, 125, 600],
       "card": ['XXX', 'YYY', 'YYY', 'XXX', 'XXX', 'YYY', 'XXX']})

С указанным выше фреймом данных я хотел вывод, как показано ниже:

Для каждого card number я хотел следующие записи:

Card number, % of Amount spent of Group code 1, % of Amount spent on Group code 2,… .so on для другого кода группы

% of Amount spent on any group = (Total amount spend on the card / Amount spend on that group ) * 100

Кроме того, на более крупном изображении я хотел знать 5 лучших групп для каждой карты, на которую потрачена сумма.?

Это в основном 2 запроса. Будет здорово, если кто-нибудь сможет мне помочь.

Примечание. Данный код предназначен только для понимания того, как выглядит мой фрейм данных.

1 Ответ

0 голосов
/ 22 ноября 2018

Относительно первого запроса: сначала мы получаем общую сумму, потраченную на каждую карту:

card_totals = df.groupby('card').sum()['amount'].reset_index().to_dict(orient='list')
card_totals_dict = dict(zip(card_totals['card'], card_totals['amount']))
card_totals_dict

Вывод:

{'XXX': 1325, 'YYY': 465}

Затем мы рассчитываем процент для каждой группы:

group_percentage = df.groupby(['card', 'group_code']).sum()['amount'].reset_index()
group_percentage['percentage'] = group_percentage['amount'] * 100 / group_percentage['card'].apply(card_totals_dict.get)
group_percentage

Вывод:

card group_code  amount  percentage
0  XXX        111     725    54.7170
1  XXX        333     600    45.2830
2  YYY        111     325    69.8925
3  YYY        222     140    30.1075

Что касается второго запроса, он звучит очень похоже на этот вопрос , поэтому я бы сказал:

df.groupby(['card', 'group_code']).agg({'amount': sum})['amount'].groupby(level=0, group_keys=False).nlargest(5)

Использование nlargest(1) возвращает

card  group_code
XXX   111           725
YYY   111           325
Name: amount, dtype: int64
...