У меня есть набор продуктов, обозначенных их кодами, и меня интересуют лучшие 5 продаваемых продуктов за месяц (скажем, их product_id
- P112 (Top 1), P134 (Top 2), P219 (Top 3), P361 ( Top 4) и P443 (Top 5), хотя они меняются из месяца в месяц). У меня есть таблица, которая имеет employee_id
, customer_id
, product_id
и purchase_date
, и каждая строка в таблице представляет продажу. Меня интересуют только продажи, в которых есть 5 лучших продуктов, потому что я хочу показать распределение 5 лучших продаж для каждого сотрудника. По сути, я хочу создать новую таблицу с уникальным сотрудником для каждой строки, а затем сколько продаж у них для каждого из 5 лучших продуктов в виде столбцов.
Учитывая следующую таблицу (намного дольше на самом деле) и идентификаторы для лучших 5 продуктов:
Employee_id | Customer_id | Product_id | Date |
E12 | C10 | P112 | 10/05/18 |
E11 | C5 | P400 | 10/05/18 |
E20 | C19 | P219 | 10/06/18 |
E23 | C10 | P155 | 10/07/18 |
E19 | C06 | P219 | 10/07/18 | ...
Результирующая рамка данных будет выглядеть примерно так:
Employee_id | Top1 | Top2 | Top3 | Top4 | Top5 |
E12 | 1 | 0 | 5 | 6 | 0 |
E19 | 3 | 2 | 1 | 0 | 1 |
E23 | 2 | 1 | 0 | 4 | 2 |
E44 | 0 | 0 | 0 | 0 | 0 | ...
Я не уверен, как перейти от первого кадра данных к второму файлу данных чистым и понятным образом. Я планировал использовать Панды. Одна из моих идей заключалась в том, чтобы выполнить итерацию по первому файлу данных и создать словарь для каждого из лучших продуктов, где ключ будет employee_id
а значением будет счет (который увеличивается, если верхний продукт отображается для сотрудника). Однако многие детали реализации отсутствуют. Я хотел бы получить любое руководство, код или предлагаемые подходы. Спасибо!
Сначала фильтруйте только файл top5 с помощью boolean indexing
с помощью isin
, затем получайте подсчеты по size
и unstack
помощью unstack
, добавьте reindex
для правильного упорядочения столбцов и в последний раз создайте новые имена колонок с f-strings
и list comprehension
:
#top5 created dynamically from column Product_id
#top5 = df['Product_id'].value_counts().index[:5])
top5 = ['P112','P134','P219','P361','P443']
df = (df[df['Product_id'].isin(top5)]
.groupby(['Employee_id','Product_id'])
.size()
.unstack(fill_value=0)
.reindex(columns=top5, fill_value=0))
df.columns = [f'Top{x}' for x in range(1,6)]
print (df)
Top1 Top2 Top3 Top4 Top5
Employee_id
E12 1 0 0 0 0
E19 0 0 1 0 0
E20 0 0 1 0 0
df = df.reset_index()
print (df)
Employee_id Top1 Top2 Top3 Top4 Top5
0 E12 1 0 0 0 0
1 E19 0 0 1 0 0
2 E20 0 0 1 0 0
size
илиvalue_counts
с этой строкойdf[df['Product_id'].isin(top5)].groupby('Employee_id')['Product_id'].value_counts().unstack().reindex(columns=top5, fill_value=0)
любопытно узнать производительность. Спасибо.np.random.seed(123) N = 1000000 df = pd.DataFrame({'B': np.random.randint(1000, size=N), 'A':np.random.randint(10000,size=N)})