Группировка панд по диапазону дат и различные расчеты по нескольким столбцам - PullRequest
0 голосов
/ 05 июля 2018

У меня проблемы с группировкой панд df по временному диапазону и различными вычислениями по столбцу:

Давайте возьмем следующее df:

           date          identifier    value_1    value_2
0     05.07.2018 16:35       A           10          0
1     05.07.2018 16:36       B           20          1
2     05.07.2018 16:37       A           20          2
3     05.07.2018 16:39       B           30          1
4     05.07.2018 16:40       A           40          3
5     05.07.2018 16:41       B           20          2
6     05.07.2018 16:41       A           30          1
7     05.07.2018 16:42       B           50          2
8     05.07.2018 16:43       B           20          3
9     05.07.2018 16:44       A           20          1

В результате мне нужен df, который сгруппирован по времени с интервалами в 5 минут и по идентификатору со средним значением value_1 и суммой value_2:

           date          identifier    value_1    value_2
0     05.07.2018 16:35       A           15          2
1     05.07.2018 16:35       B           25          2
2     05.07.2018 16:40       A           30          5
3     05.07.2018 16:40       B           30          7

Как я могу сделать это наиболее эффективным способом в пандах?

THX & BR из Вены

1 Ответ

0 голосов
/ 05 июля 2018

вы можете использовать groupby, pd.Grouper и agg после установки для столбца date значения datetime с помощью правильный формат:

# Set date to datetime format. I'm assuming it's day.month.year in your original dataframe
df['date'] = pd.to_datetime(df.date, format = '%d.%m.%Y %H:%M')

new_df = (df.groupby(['identifier', pd.Grouper(key='date', freq='5min')])
          .agg({'value_1':'mean', 'value_2':'sum'}))

>>> new_df
                                value_1  value_2
identifier date                                 
A          2018-07-05 16:35:00       15        2
           2018-07-05 16:40:00       30        5
B          2018-07-05 16:35:00       25        2
           2018-07-05 16:40:00       30        7

Если вы хотите использовать тот же формат, что и желаемый вывод в вашем сообщении, вы можете использовать его для сортировки:

new_df.reset_index().sort_values(['date','identifier'])

  identifier                date  value_1  value_2
0          A 2018-07-05 16:35:00       15        2
2          B 2018-07-05 16:35:00       25        2
1          A 2018-07-05 16:40:00       30        5
3          B 2018-07-05 16:40:00       30        7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...