Как я могу получить начало и конец интервала функции groupby.agg, когда временная метка является индексом?

#python #pandas #group-by

#python #панды #группировка по

Вопрос:

Пример фрейма данных:

 import pandas as pd
import numpy as np

days = pd.date_range('2020-01-01 00:00:00','2020-01-02 00:00:00',freq='1S')
data = np.random.randint(1, high=100, size=len(days))
category = np.random.choice(['A', 'B', 'C', 'D'],  size=len(days))

df = pd.DataFrame({'time': days, 'category': category, 'data': data})
df = df.set_index('time')
df
  

Вывод:

                     category  data
time                              
2020-01-01 00:00:00        B    27
2020-01-01 00:00:01        D    10
2020-01-01 00:00:02        D    87
2020-01-01 00:00:03        B    78
2020-01-01 00:00:04        A    49
2020-01-01 00:00:05        C    21
2020-01-01 00:00:06        C    32
2020-01-01 00:00:07        A    95
2020-01-01 00:00:08        B    75
2020-01-01 00:00:09        B    19
                     ...   ...
2020-01-01 23:59:51        D     9
2020-01-01 23:59:52        D    67
2020-01-01 23:59:53        B    57
2020-01-01 23:59:54        D    51
2020-01-01 23:59:55        A    75
2020-01-01 23:59:56        D    47
2020-01-01 23:59:57        B    19
2020-01-01 23:59:58        A    90
2020-01-01 23:59:59        D     7
2020-01-02 00:00:00        B    44

[86401 rows x 2 columns]
  

Я хотел бы рассчитать для каждой категории минимальное, максимальное, среднее значение ДАННЫХ, а также минимальную и МАКСИМАЛЬНУЮ временные метки. Однако, поскольку метка времени является индексом, я не знаю, как это сделать. Я получаю:

 df.groupby('category').agg({'time': [min, max], 'data': [np.min, np.max, np.average]})

KeyError: "Column 'time' does not exist!"
  

Если я удалю «‘time’: [min, max]», это сработает:

          data                
         amin amax    average
category                     
A           1   99  50.072437
B           1   99  49.542499
C           1   99  50.291096
D           1   99  49.851255
  

Ответ №1:

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

 df.reset_index().groupby('category').agg({'time': [min, max], 'data': [np.min, np.max, np.average]})
  

Вывод:

введите описание изображения здесь

Комментарии:

1. Спасибо! Знаете ли вы, какой параметр я должен использовать, чтобы также получить «режим»? min, max, average и mode (пробовал np.mode, не существует).

2. Я знаю, что уже поздно, но вы можете использовать pd.Series.mode из pandas или scipy.stats.mode из пакета scipy