Группировать по столбцам и иметь столбец со словарем value_counts - PullRequest
1 голос
/ 01 февраля 2020

У меня есть таблица продаж с историей покупок клиентов. Я хочу создать новый фрейм данных, сгруппированный по клиенту. Фрейм данных должен также включать столбец со словарем value_counts всех продуктов, которые покупатель приобрел, и счетчиком количества каждого продукта.

Я сделал следующее:

categories = data.groupby(by=['CustomerID']).Description.value_counts().to_frame().rename(columns={'Description':'Counts'}).reset_index(level='Description')

, который производит это:

              Description          Counts
CustomerID
3004000304    MAJOR APPLIANCES     3
3004000304    HOME OFFICE          2
3004000304    ACCESSORIES          1
3004002756    MAJOR APPLIANCES     1
3004002946    HOME OFFICE          2
3004002946    ACCESSORIES          1
3004002946    MAJOR APPLIANCES     1 

Я пытался увидеть, могу ли я исправить вышеупомянутый фрейм данных следующим образом:

categories['Merged'] = categories.apply(lambda x: {x['Description']:x['Counts']}, axis=1)

, который дает мне это:

              Description          Counts   Merged
CustomerID
3004000304    MAJOR APPLIANCES     3        {'MAJOR APPLIANCES': 3}
3004000304    HOME OFFICE          2        {'HOME OFFICE': 2}
3004000304    ACCESSORIES          1        {'ACCESSORIES': 1}
3004002756    MAJOR APPLIANCES     1        {'MAJOR APPLIANCES': 1}
3004002946    HOME OFFICE          2        {'HOME OFFICE': 2}
3004002946    ACCESSORIES          1        {'ACCESSORIES': 1}
3004002946    MAJOR APPLIANCES     1        {'MAJOR APPLIANCES': 1}

но я хочу это:

              Counts
CustomerID
3004000304    {'MAJOR APPLIANCES': 3, 'HOME OFFICE': 2, 'ACCESSORIES': 1}
3004002756    {'MAJOR APPLIANCES': 1}
3004002946    {'HOME OFFICE': 2, 'ACCESSORIES': 1, 'MAJOR APPLIANCES': 1}

Некоторая помощь в создании вышеуказанного кадра данных будет принята с благодарностью

1 Ответ

2 голосов
/ 01 февраля 2020

Используйте GroupBy.apply с лямбда-функцией с zip и dict:

f = lambda x: dict(zip(x['Description'], x['Counts']))
df = categories.groupby(level=0).apply(f).to_frame('Counts')
print (df)
                                                       Counts
CustomerID                                                   
3004000304  {'MAJOR APPLIANCES': 3, 'HOME OFFICE': 2, 'ACC...
3004002756                            {'MAJOR APPLIANCES': 1}
3004002946  {'HOME OFFICE': 2, 'ACCESSORIES': 1, 'MAJOR AP...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...