Группировка фреймов данных Pandas и процент на основе нескольких столбцов

#python #python-3.x #pandas #dataframe

Вопрос:

Я хочу вычислить процент от 2 столбцов и добавить его к исходному кадру данных.

 import numpy as np
import pandas as pd
np.random.seed(0)
df = pd.DataFrame({'state': ['CA', 'WA', 'CO', 'AZ'] * 3,
               'office_id': list(range(1, 7)) * 2,
               'counts': list(range(1, 3)) * 6,
               'sales_year': [np.random.randint(2019, 2021) for _ in range(12)],
               'sales': [np.random.randint(100000, 999999) for _ in range(12)]})

state_office = df.groupby(['state', 'office_id']).agg({'sales': 'sum'})
state = df.groupby(['sales_year']).agg({'sales': 'sum'})
state_office.div(state, level='state') * 100
 
  • Я хотел бы вычислить процент продаж для каждой группы [‘state’, ‘office_id’, ‘sales_year] и добавить в новый столбец под названием «aggr_sales» (я хотел бы сохранить исходные названия столбцов)
  • Вычислите процент количества для каждой группы и добавьте в новый столбец «aggr_counts» (я хотел бы сохранить исходные имена столбцов).
  • Я хотел бы иметь один кадр данных с обоими процентами.

Ценю любой вклад.

Спасибо, С

Комментарии:

1. Ваш вопрос неоднозначен, вы хотите сгруппироваться по ['state', 'office_id', 'sales_year] (всем трем вместе)? Это дает группы только с одиночными строками, таким образом, все проценты на группу будут равны 100%

2. Вы правы, позвольте мне перефразировать вопрос, удалив «sales_year». Спасибо, что указали.

3. Все та же проблема, так как в каждом штате есть только один идентификатор office_id :p Я дам вам ответ для состояния sales_year. Если это не то, что вы хотите, пожалуйста, предоставьте ожидаемый результат

Ответ №1:

Вот ответ для сгруппированного состояния sales_year:

 df['aggr_counts'] = (df.groupby(['state', 'sales_year'])
                       ['sales'].apply(lambda x: 100*x/x.sum())
                     )
 

выход:

    state  office_id  counts  sales_year   sales  aggr_counts
0     CA          1       1        2019  474564   100.000000
1     WA          2       2        2020  835831    37.219871
2     CO          3       1        2020  836326    35.053616
3     AZ          4       2        2019  410744    29.372909
4     CA          5       1        2020  270584    25.895015
5     WA          6       2        2020  939052    41.816341
6     CO          1       1        2020  704474    29.527195
7     AZ          2       2        2020  641377   100.000000
8     CA          3       1        2020  774343    74.104985
9     WA          4       2        2020  470775    20.963789
10    CO          5       1        2020  845048    35.419188
11    AZ          6       2        2019  987633    70.627091