Запросите фрейм данных для создания нового фрейма данных в пандах

1

У меня есть набор продуктов, обозначенных их кодами, и меня интересуют лучшие 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 а значением будет счет (который увеличивается, если верхний продукт отображается для сотрудника). Однако многие детали реализации отсутствуют. Я хотел бы получить любое руководство, код или предлагаемые подходы. Спасибо!

Теги:
pandas
dataframe
dictionary

1 ответ

3
Лучший ответ

Сначала фильтруйте только файл 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
  • 0
    Можете ли вы проверить, какой из них лучше или size или value_counts с этой строкой df[df['Product_id'].isin(top5)].groupby('Employee_id')['Product_id'].value_counts().unstack().reindex(columns=top5, fill_value=0) любопытно узнать производительность. Спасибо.
  • 0
    @SandeepKadapa - Сложный вопрос, это зависит от данных. Но я пробую время: np.random.seed(123) N = 1000000 df = pd.DataFrame({'B': np.random.randint(1000, size=N), 'A':np.random.randint(10000,size=N)})
Показать ещё 12 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню