Более быстрый способ выбора различных разделов данных, чем цикл for? - PullRequest
0 голосов
/ 05 января 2019

у меня есть датафрейм заказов instacart

order_id    product_id  add_to_cart_order   reordered   product_name    
32          49683       7                   1           Cucumber Kirby  
52          49683       4                   1           Cucumber Kirby  
88          49683       20                  0           Cucumber Kirby  
95          49683       12                  1           Cucumber Kirby  
111         49683       5                   1           Cucumber Kirby  

Порядок заказа равен 1 или 0, что указывает на то, заказывал ли клиент этот продукт в предыдущем заказе или нет.

Я хочу получить информацию по каждому продукту, например, я хотел бы знать, какие продукты имеют наибольшее количество повторных заказов (среди прочего). Единственный способ, которым я могу придумать, - это перебрать кадр данных, выбирая только строки по имени продукта по одной за раз, и суммируя значения переупорядоченных для каждого продукта. Единственная проблема в том, что существует около 92 тысяч различных продуктов, и это ломает мой компьютер и навсегда. Вот мой код Я сохраняю результаты в словарь, но я открыт для других подходов. Должен быть более эффективный способ сделать это?

reordersums = {}
for product in list(products.product_name):
# Select the rows whose product name matches the product we are checking, sum the values in column "reordered"
    reordersum = order_products[order_products.product_name == product].reordered.sum()

    reordersums[product]=reordersum    
print(reordersums)

Ответы [ 2 ]

0 голосов
/ 05 января 2019

Пожалуйста, попробуйте ниже, однако я не уверен, что это то, что вы ищете:

Ваша иллюстрированная структура DataFrame:

   order_id  product_id  add_to_cart_order  reordered    product_name
0        32       49683                  7          1  Cucumber Kirby
1        52       49683                  4          1  Cucumber Kirby
2        88       49683                 20          0  Cucumber Kirby
3        95       49683                 12          1  Cucumber Kirby
4       111       49683                  5          1  Cucumber Kirby

Решение: groupby + DataFrame.filter + sum ()

>>> df.groupby('reordered').filter(lambda x: len(x) > 1).groupby(['product_name']).sum().reset_index()
     product_name  order_id  product_id  add_to_cart_order  reordered
0  Cucumber Kirby       290      198732                 28          4

ИЛИ , как предложено @Amit в разделе комментариев.

>>> df[df.reordered==1].groupby('product_name').sum().reset_index()
     product_name  order_id  product_id  add_to_cart_order  reordered
0  Cucumber Kirby       290      198732                 28          4

ИЛИ , если вы хотите видеть только product_name & reordered

df.set_index('product_name').reordered.ge(1).sum(level=0).astype(int).reset_index()
     product_name  reordered
0  Cucumber Kirby          4
0 голосов
/ 05 января 2019

Попробуйте использовать интерфейс group_by :

# Group up the dataframe by product
group_products = products.groupby('product_name')

# Sum the groups on the reordered column
reordered_sums = group_products['reordered'].agg('sum')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...