Python группа данных по следующим значениям - PullRequest
0 голосов
/ 26 ноября 2018

Я ищу лучший питонический способ для группировки суммы значений, следующих друг за другом от часа к часу.Пример: у меня есть следующий Dataframe со столбцами «date» и «rainfall », и я добавил пример желаемого результата:

        date        rainfall    RE
    31/12/17 23:00  0.88    None
    01/01/18 00:00  0.38    1.26
    01/01/18 01:00  0       None
    01/01/18 02:00  0.22    0.22
    01/01/18 03:00  0       None
    01/01/18 04:00  0       None
    01/01/18 13:00  0       None
    01/01/18 14:00  0       None
    01/01/18 15:00  0.55    0.55
    01/01/18 16:00  0       None
    01/01/18 17:00  1.31    1.31
    01/01/18 18:00  0       None
    01/01/18 19:00  0.49    0.49
    01/01/18 20:00  0       None
    01/01/18 21:00  0       None
    01/01/18 22:00  0       None
    01/01/18 23:00  0       None
    02/01/18 00:00  0.7     None
    02/01/18 01:00  0.22    None
    02/01/18 02:00  0.61    None
    02/01/18 03:00  0.42    1.95
    02/01/18 04:00  0       None
    02/01/18 05:00  1.69    1.69
    02/01/18 06:00  0       None
    02/01/18 07:00  0       None
    02/01/18 08:00  0       None

Я надеюсь, что будет ясно,

спасибомного за вашу помощь,

Реми

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Окей, это не лучший вариант, но когда у вас большие фреймы данных, это может быть простой подход.(Если идет дождь в начале или в конце, это будет проигнорировано в этом примере. См. Предупреждение)

import pandas as pd
import numpy as np

# generate pseudo dataframe
rng = pd.date_range('1/1/2012', periods=20, freq='H')
rain = np.random.choice([0,0.5,1,2], size=20, p=[0.4,0.2,0.2,0.2])

df = pd.DataFrame()
df['data'] = rng
df['rain'] = rain

# convert rain to boolean
df['is_rain'] = df['rain'] > 0

# shift rain for one slot to recognice if the state has changed
data = list(df['is_rain'].values[0:-1])
shifted = [data[0]]
shifted.extend(data)
df['is_rain_next'] = shifted

# get start and endpoints of rain (the end has to be excluded! 
# it is always the next period, when it isn't raining anymore)
df['rain_start'] = df['is_rain'] < df['is_rain_next']
df['rain_end'] = df['is_rain'] > df['is_rain_next']

# this are the starts and ends you can use them for getting the groups from dataframe
df[df['rain_start']].index
df[df['rain_end']].index

Предупреждение : массивы могут иметь разные размеры, вызванныенеизвестное состояние в конце и в начале.Поэтому проверьте, меньше ли первый элемент в rain_end, чем первый элемент в rain_start, чем вы можете его удалить.Также, если последний элемент rain_start больше, чем последний элемент rain_end (звучит логично, я думаю)

0 голосов
/ 26 ноября 2018

Если я правильно понимаю, то, что вы хотите, это скользящая сумма.Следующее будет выводить серию Pandas скользящих сумм «осадков» за 2 периода

df['rainfall'].rolling(2).sum()

Конечно, ваш DataFrame должен оставаться отсортированным, как показано в вашем примере.

добавлениеэто как часть вашего DataFrame будет:

df['rainfall_rolling_sum'] = df['rainfall'].rolling(2).sum()

EDIT1:

Если вы имеете в виду, что вы просто хотите накапливать использование осадков:

df['rainfall_cumsum'] = df['rainfall'].cumsum()

как функция cumsum() - это накопительная сумма

EDIT2:

rf_not_zero = df['rainfall'] != 0
df['rainfall_accum'] = df['rainfall'].cumsum()-df['rainfall'].cumsum().where(~df_not_zero).ffill().fillna(0).astype(int)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...