#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