May 7, 2021

Когда GroupBy не объединяет

Чтобы не приходить в замешательство, надо знать нетипичное поведение некоторых функций с GroupBy объектом Pandas. Так, ожидаемым поведением является получение свертки таблицы с агрегирующими статистиками, однако имеются функции, которые "разворачивают" результат до размеров первоначального объекта по умолчанию.

К их числу относятся fillna, ffill, bfill, shift (перечислены здесь). Действие последних подобно вызову функций на объекте GroupBy с методом transform, который и славится нежеланием сворачивать данные в группы (подробнее о нем рассказывал ранее).

Рассмотрим это поведение на примере.

import pandas as pd
import numpy as np

df1 = pd.DataFrame({'gr':[1,2,1,2,2,2,1],
                   'val1':[np.nan, 6, 3, np.nan, np.nan, 8, -5],
                   'val2':[1, np.nan, 3, 2, -9, 3, np.nan]})

df2 = df1.groupby('gr').bfill()
df3 = df1.groupby('gr').transform(lambda x: x.bfill())

df2 и df3 получаются абсолютно идентичными. Обе таблицы имеют размерность как и исходная с заполненными некоторыми значениями:

А вот еще один пример:

df2 = df1.groupby('gr').fillna(method='ffill')
df3 = df1.groupby('gr').transform(lambda x: x.ffill())

Кстати, вспомнив примеры вызова shift из прошлой статьи вы можете убедиться, что данный метод работает аналогично.