Pandas groupby и pct изменения не возвращают ожидаемое значение - PullRequest
0 голосов
/ 28 июня 2018

Для каждого 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 Ответ

0 голосов
/ 27 декабря 2018

Как уже отмечалось @piRSquared в комментариях; это связано с ошибкой , зарегистрированной на Github под номером 21621 . Это уже выглядит, чтобы быть решенным в вехе 0.24.0 (к 2018-12-31). Моя версия (0.23.4) по-прежнему отображала это ошибочное поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...