Как мне выполнить суммирование `n` строк за раз в пандах?

Учитывая фрейм данных

     A
0   14
1   59
2   38
3   40
4   99
5   89
6   70
7   64
8   84
9   40
10  30
11  94
12  65
13  29
14  48
15  26
16  80
17  79
18  74
19  69

Этот фрейм данных имеет 20 столбцов. Я бы хотел группу n=5 строки и суммировать их. Итак, мой вывод будет выглядеть так:

     A
0  250
1  347
2  266
3  328 

df.rolling_sum не поможет, потому что не позволяет варьировать шаг при суммировании.

Какие еще есть способы сделать это?

3 ответа

Решение
df.set_index(df.index // 5).sum(level=0)

Предполагая, что ваши индексы смежны, вы можете выполнить целочисленное деление на df.index, а затем сгруппировать по индексу.

Для df выше, вы можете сделать это:

In [447]: df.index // 5
Out[447]: Int64Index([0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3], dtype='int64')

Получить окончательный ответ - еще один шаг, используя df.groupby а также dfGroupBy.sum:

In [448]: df.groupby(df.index // 5).sum()
Out[448]: 
     A
0  250
1  347
2  266
3  328

Если у вас нет RangeIndex использовать df.reset_index сначала и потом группа.

Если вы можете управлять ndarray суммами, а не сериями (вы всегда можете построить серию заново), вы можете использовать np.add.reduceat,

np.add.reduceat(df.A.values, np.arange(0, df.A.size, 5))

Который в этом случае возвращает

array([250, 347, 266, 328])
Другие вопросы по тегам