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