Вычисление max / min для каждого n строк данных в python - PullRequest
2 голосов
/ 05 февраля 2020

Я хочу вычислить мин / макс для каждых n строк df, скажем, 10, но использование df.rolling (10) .max () дает значения для строк 0-9, 1-10, 2-11 и др c. Я хочу 0-9, 10-19, 20-29 и т.д. c

Есть ли удобный способ сделать это для большого набора данных?

Спасибо

Ответы [ 2 ]

2 голосов
/ 05 февраля 2020

Ключом к успеху является группировка по np.arange (len (df.index)) // 10 (или изменение 10 (размер группы) на любое другое значение, которое вы нужно).

Предполагая, что у вас есть 3 столбца для вычисления мин / макс ( ['A', 'B', 'C'] ), вы можете запустить:

df.groupby(np.arange(len(df.index)) // 10)[['A', 'B', 'C']].agg(['min', 'max'])
2 голосов
/ 05 февраля 2020

Используйте np.arange, чтобы вычислить массив от 0 до len (df) -1, а затем вычислить все деление. Мы можем использовать этот массив вместе с DataFrame.groupby.

n=9
df.groupby(np.arange(len(df))//n).max()

Пример

Настройка

df=pd.DataFrame({'A':range(30)})
print(df)
     A
0    0
1    1
2    2
3    3
4    4
5    5
6    6
7    7
8    8
9    9
10  10
11  11
12  12
13  13
14  14
15  15
16  16
17  17
18  18
19  19
20  20
21  21
22  22
23  23
24  24
25  25
26  26
27  27
28  28
29  29

Решение

n=9
df_max = df.groupby(np.arange(len(df))//n).max()
print(df_max)
    A
0   8
1  17
2  26
3  29

Как видите, группы, перечисленные от 0 до m, создаются. Полученный DataFrame является максимальным значением для каждой группы.


Вы также можете выбрать столбцы для вычисления max

df.groupby(np.arange(len(df))//n)[cols].max()

и, конечно, использовать groupby.agg* 1037. * если вы хотите использовать более одной функции

Подробно

np.arange(len(df))//n
#array([0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2,
#       2, 2, 2, 2, 2, 3, 3, 3])

РЕДАКТИРОВАТЬ

first_row = 2
df2 = df[first_row:]
df2.groupby(np.arange(len(df2))//n).max()
...