Фрейм данных Python pandas, агрегирующий построчно до критерия остановки - PullRequest
0 голосов
/ 30 января 2019

Я хотел бы суммировать по определенным строкам в столбце и создать новый фрейм данных только с агрегированными значениями.Например, исходный кадр выглядит так (с A = ID, B = датум [ггггммдд], C = час + мин [ччмм], D = значение)

    A         B     C    D
11035  20190101  0010  1.1
11035  20190101  0020  1.9
11035  20190101  0030  3.3
11035  20190101  0040  1.0
11035  20190101  0050  2.9
11035  20190101  0100  0.5
11001  20190109  0110  0.0
11001  20190109  0120  0.2
11001  20190109  0130  1.5
11001  20190109  0140  1.2
11001  20190109  0150  1.9
11001  20190109  0200  4.5
.
.
.

Окончательный кадр данных должен включать только эти строкив полный час (т. е. 0100, 0200, ...), но значения должны содержать сумму предыдущих 6 значений (например, для 0100: сумма от 0010 до 0100).Фрейм выходных данных в приведенном выше примере должен выглядеть следующим образом:

    A         B     C     D
11035  20190101  0100  10.7
11001  20190109  0200   9.3
.
.
.

Как наиболее эффективно кодировать это упражнение?

Большое спасибо за вашу помощь!

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Это работает для строк, приведенных в примере, но для больших наборов данных, кажется, не работает должным образом: например, если кадр:

    A         B     C    D
11035  20190101  0010  1.1
11035  20190101  0020  1.9
11035  20190101  0030  3.3
11035  20190101  0040  1.0
11035  20190101  0050  2.9
11035  20190101  0100  0.5
11035  20190101  0110  1.1
11035  20190101  0120  1.9
11035  20190101  0130  0.3
11035  20190101  0140  1.0
11035  20190101  0150  2.9
11035  20190101  0200  0.5
11001  20190109  0110  0.0
11001  20190109  0120  0.2
11001  20190109  0130  1.5
11001  20190109  0140  1.2
11001  20190109  0150  1.9
11001  20190109  0200  4.5

, то мой вывод:

       A         B    C     D
0  11001  20190109  200   9.3
1  11035  20190101  200  18.4

но это должно быть:

       A         B    C     D
0  11035  20190101  100  10.7
1  11035  20190101  200   7.7
2  11001  20190109  200   9.3

Таким образом, условие groupby должно быть расширено до столбца C, где все значения C находятся в течение последнего часа ...

0 голосов
/ 30 января 2019

Лучший подход, предложенный @roganjosh -Thanks

df_new=df.groupby(['A','B']).agg({'C': 'max', 'D': 'sum'}).reset_index().sort_values('C')
print(df_new)

    A         B     C     D
11035  20190101  0100  10.7
11001  20190109  0200   9.3

РЕДАКТИРОВАТЬ на вопрос в ответе

df.groupby(['A','B',(df.C%100==0).cumsum().shift().fillna(0)]).\
agg({'D':'sum','C':lambda x: x[x%100==0]}).reset_index(level=[0,1]).sort_values('A',ascending=False).reset_index(drop=True)
       A         B     D    C
0  11035  20190101  10.7  100
1  11035  20190101   7.7  200
2  11001  20190109   9.3  200
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...