Вычислите среднее значение, используя два столбца в pandas

#python #pandas

#python #pandas

Вопрос:

У меня есть фрейм данных сделки с тремя столбцами, и я отсортировал его по типу и дате, это выглядит так:

   type    date      price
   A    2020-05-01   4
   A    2020-06-04   6
   A    2020-06-08   8
   A    2020-07-03   5
   B    2020-02-01   3
   B    2020-04-02   4
  

Существует много типов (A, B, C, D, E …), я хочу рассчитать предыдущую среднюю цену продукта того же типа. Например: значение pre_mean_price третьей строки A равно (4 6)/2=5. Я хочу получить такой фрейм данных:

    type    date      price  pre_mean_price
   A    2020-05-01   4       .
   A    2020-06-04   6       4
   A    2020-06-08   8       5 
   A    2020-07-03   5       6
   B    2020-02-01   3       .
   B    2020-04-02   4       3
  

Как я могу вычислить pre_mean_price? Большое спасибо!

Ответ №1:

Вы можете использовать expanding().mean() after groupby для каждой группы, затем сдвинуть значения.

 df['pre_mean_price'] = df.groupby("type")['price'].apply(lambda x: 
                                                         x.expanding().mean().shift())
print(df)
  

   type        date  price  pre_mean_price
0    A  2020-05-01      4             NaN
1    A  2020-06-04      6             4.0
2    A  2020-06-08      8             5.0
3    A  2020-07-03      5             6.0
4    B  2020-02-01      3             NaN
5    B  2020-04-02      4             3.0
  

Ответ №2:

Что-то вроде

 df['pre_mean_price'] = df.groupby('type').expanding().mean().groupby('type').shift(1)['price'].values
  

который выдает

   type        date  price  pre_mean_price
0    A  2020-05-01      4             NaN
1    A  2020-06-04      6             4.0
2    A  2020-06-08      8             5.0
3    A  2020-07-03      5             6.0
4    B  2020-02-01      3             NaN
5    B  2020-04-02      4             3.0
  

Краткое объяснение

Идея состоит в том, чтобы

  • Первая "type" группа с .groupby() помощью . Это необходимо сделать, поскольку мы хотим вычислить (инкрементные) средние значения внутри группы «тип».
  • Затем вычислите инкрементное среднее значение с expanding().mean() помощью . Вывод в этой точке
         price
type
A    0   4.00
     1   5.00
     2   6.00
     3   5.75
B    4   3.00
     5   3.50
  
  • Затем снова сгруппируйте by "type" и сдвиньте элементы внутри групп на одну строку с shift(1) помощью .
  • Затем просто извлеките значения price столбца (инкрементные средние)
  • Примечание: предполагается, что ваши данные отсортированы по дате. Это не так, позвоните df.sort_values('date', inplace=True) раньше.