Для каждого 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
.