Когда 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 из прошлой статьи вы можете убедиться, что данный метод работает аналогично.