Pandas Groupby возвращает среднее значение, НО! исключить NaN

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

Итак, я пытаюсь разобраться в функции pandas groupby и уменьшить большой кадр данных, который у меня есть. Вот пример:

                              A        B
2016-09-23 19:36:08 00:00   NaN     34.0
2016-09-23 19:36:11 00:00   NaN     33.0
2016-09-23 19:36:12 00:00   24.1    NaN
2016-09-23 19:36:14 00:00   NaN     34.0
2016-09-23 19:36:17 00:00   NaN     34.0
2016-09-23 19:36:20 00:00   NaN     34.0
2016-09-23 19:36:22 00:00   24.2    NaN
2016-09-23 19:36:23 00:00   NaN     34.0
2016-09-23 19:36:26 00:00   NaN     34.0
2016-09-23 19:36:29 00:00   NaN     34.0
2016-09-23 19:36:32 00:00   24.1    NaN
2016-09-23 19:36:33 00:00   NaN     34.0
2016-09-23 19:37:00 00:00   NaN     34.0
2016-09-23 19:37:02 00:00   24.1    NaN
  

Итак, у меня есть 2 ряда данных «A» и «B», которые были отобраны с разной скоростью, с их временем выборки в качестве индекса исходного фрейма данных.

Теперь я хотел бы сгруппировать строки фрейма данных по дате / часу / минуте и вернуть среднее значение данных за минуту. Здесь среднее значение должно игнорировать отсутствующие значения во фрейме данных.

Так, например, я бы вернул что-то вроде этого:

                              A        B
2016-09-23 19:36:00 00:00   24      34.0
2016-09-23 19:37:00 00:00   24.1    33.0
  

Возможно ли это сделать с помощью встроенной функции pandas?

Ответ №1:

Я думаю, вам нужен resample with Resampler.mean , который вычисляет среднее значение групп, исключая пропущенные значения:

 print (df.resample('1Min').mean())
                             A          B
2016-09-23 19:36:00  24.133333  33.888889
2016-09-23 19:37:00  24.100000  34.000000
  

Другое решение с groupby :

 print (df.groupby([pd.TimeGrouper('1Min')]).mean())
                             A          B
2016-09-23 19:36:00  24.133333  33.888889
2016-09-23 19:37:00  24.100000  34.000000
  

Комментарии:

1. Спасибо за ваш ответ. Оба эти решения выглядят красиво. Но для меня они возвращаются с ошибкой: «Ошибка данных: нет числовых типов для агрегирования». Может ли это быть связано с тем, что индекс моего фрейма данных имеет объекты datetime?

2. Нет, это означает, что ваши столбцы не преобразуются в числовые. Попробуйте df.A = df.B.astype(float) и df.B = df.b.astype(float) . Если возвращается ошибка, есть другое возможное решение, поэтому вопрос в том, как работает astype кастинг?