Для каждого Name в следующем фрейме данных я пытаюсь найти процентное изменение от одного Time к следующему в столбце Amount:
Код для создания кадра данных:
import pandas as pd
df = pd.DataFrame({'Name': ['Ali', 'Ali', 'Ali', 'Cala', 'Cala', 'Cala', 'Elena', 'Elena', 'Elena'],
'Time': [1, 2, 3, 1, 2, 3, 1, 2, 3],
'Amount': [24, 52, 34, 95, 98, 54, 32, 20, 16]})
df.sort_values(['Name', 'Time'], inplace = True)
Первый подход, который я попробовал (основываясь на этом вопросе и ответе), использовал groupby и pct_change:
df['pct_change'] = df.groupby(['Name'])['Amount'].pct_change()
С результатом:
Это не группировка по имени, потому что это тот же результат, как если бы я не использовал groupby и назвал df['Amount'].pct_change(). Согласно Документации Pandas для pandas.core.groupby.DataFrameGroupBy.pct_change, вышеуказанный подход должен работать для расчета процентного изменения каждого значения к предыдущему значению в группе.
Для второго подхода я использовал groupby с apply и pct_change:
df['pct_change_with_apply'] = df.groupby('Name')['Amount'].apply(lambda x: x.pct_change())
С результатом:
На этот раз все процентные изменения верны.
Почему подход groupby и pct_change не возвращает правильные значения, а использование groupby с apply делает?
Изменить 28 января 2018 года: Это поведение было исправлено в последней версии Pandas, 0.24.0. Для установки запуска pip install -U pandas.


