Группировать / фильтровать и выполнять вычисления по строкам фрейма данных

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

#python #python-3.x #панды #фрейм данных

Вопрос:

У меня есть фрейм данных с товарами, продаваемыми в разных магазинах каждый день:

     date    date_block_num  shop_id item_id item_price  item_cnt_day    day month_year
1953691 24.09.2014  20  5   1039    899.0   1.0 24  09.2014
1953692 27.09.2014  20  5   1015    449.0   1.0 27  09.2014
1953693 07.09.2014  20  5   1329    399.0   1.0 07  09.2014
1953694 27.09.2014  20  5   984 399.0   1.0 27  09.2014
1953695 08.09.2014  20  5   984 399.0   1.0 08  09.2014
  

Я хотел бы получить результаты для каждого хранилища. Итак, я попытался:

 revenues = {}
for row in transactions_december_2014.sort('shop_id').iterrows():
    if last_shop_id == row.shop_id:
        revenues[shop_id]  = row.item_price * row.item_cnt_day
        last_shop_id = row.shop_id
    else:
        revenues[shop_id] = row.item_price * row.item_cnt_day
print(max(revenues))
  

Но это возвращает меня:

 ---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-26-391a52cd0210> in <module>()
      9 # transactions_december_2014.groupby("shop_id").sum(transactions_december_2014.item_price * transactions_december_2014.item_cnt_day)
     10 revenues = {}
---> 11 for row in transactions_december_2014.sort('shop_id').iterrows():
     12     if last_shop_id == row.shop_id:
     13         revenues[shop_id]  = row.item_price * row.item_cnt_day

/opt/conda/lib/python3.6/site-packages/pandas/core/generic.py in __getattr__(self, name)
   3079             if name in self._info_axis:
   3080                 return self[name]
-> 3081             return object.__getattribute__(self, name)
   3082 
   3083     def __setattr__(self, name, value):

AttributeError: 'DataFrame' object has no attribute 'sort'
  

Я также планировал использовать groupby s:

 transactions_december_2014.groupby("shop_id").sum(transactions_december_2014.item_price * transactions_december_2014.item_cnt_day)
  

Но это никогда не работает. Сейчас я подумываю о том, чтобы сделать это сейчас с lambda помощью as, который я использую для циклов.

Ответ №1:

Как я понимаю, вы хотите вычислить общую стоимость товаров, проданных определенным магазином. Вы можете сделать это так:

 df["cost"] = df["item_price"] * df["item_cnt_day"]
df.groupby("shop_id")["cost"].sum()
  

Сначала вы создаете столбец, в котором сохраняется общая стоимость проданных товаров (цена * сколько продано). Затем вы группируете на основе хранилища, чтобы, наконец, получить сумму затрат.