Pandas groupby и pct не возвращают ожидаемое значение
Для каждого Name
в следующем фрейме данных я пытаюсь найти процентное изменение от одного Time
к следующему в столбце Amount
:
![enter image description here]()
Код для создания кадра данных:
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()
С результатом:
![enter image description here]()
Это не группировка по имени, потому что это тот же результат, как если бы я не использовал 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())
С результатом:
![enter image description here]()
На этот раз все процентные изменения верны.
Почему подход groupby
и pct_change
не возвращает правильные значения, а использование groupby
с apply
делает?
Изменить 28 января 2018 года: Это поведение было исправлено в последней версии Pandas, 0.24.0. Для установки запуска pip install -U pandas
.
Ответы
Ответ 1
Как уже отмечалось @piRSquared в комментариях; это связано с ошибкой, зарегистрированной на Github под номером 21621. Это уже выглядит, чтобы быть решенным в вехе 0.24.0
(из-за 2018-12-31). Моя версия (0.23.4
) все еще показала это ошибочное поведение.