pandas groupby apply почему иногда работает построчно, а иногда по столбцам?

Столько лет работаю в python и вот беда.

У меня есть большая таблица где есть, допустим, всего три столбца: дата, товар, и его цена ['Date','Product','Price'].

Мне нужно сгруппировать по товарам, применить кастомную функцию (пускай для простоты будет shift) в порядке дат и заджойнить новый столбец к имеющимся столбцам по товару и дате.

У меня сразу стоит мультииндекс, поэтому вот что я делаю: df.join(df.reset_index().set_index('Date').groupby('Product').apply(lambda x: pd.Series(x.Price.shift(-1), name='shifted_price')))

По началу все работало. Но потом данных стало больше и я начал ловить ошибку, мол нет столбца с именем 'Date'. Полазил в коде и увидел, что df.reset_index().set_index('Date').groupby('Product').apply(lambda x: pd.Series(x.Price.shift(-1), name='shifted_price')) больше не выглядит как Series с мультииндексом ['Product','Date'], теперь это DataFrame с индексами 'Product' и столбцами 'Date'. Я не растерялся сплавил ее в Series, задал нужный мультииндекс и заджойнил как и раньше.

Так я жил еще какое-то время. Но данных стало еще больше и та же конструкция из DataFrame снова превратилась в Series с мультииндексом. Причем формат изначальной таблицы не меняется, dtypes те же (даже диапазоны значений примерно те же). Но вот формат, как pandas возвращает комбинацию groupby(...).apply(...) почему-то поменялся.

Я уже облазил кучу документации по pandas.core.groupby.GroupBy.apply, но там ничего не сказано про возвращаемый формат. Я залез внутрь исходников, все должно работать идеально. Кто-нибудь, пожалуйста, объясните мне, где происходит магия? Я чувствую себя полным идиотом в python.

Мне не трудно переключать коды, к тому же я теперь обрабатываю через try-except по методу "какой из способов сработает, пускай так и посчитается", но это явный костыль. Хочется понимать, что происходит. Так недалеко разочароваться в питонистских методах и вернуться к циклам, пускай долго, но зато без сюрпризов. Хотя хочется верить, что проблема на поверхности, просто у меня случился затык в голове.


Ответы (0 шт):