Как сделать Назад / Вперед Группировка данных в кадре данных? - PullRequest
0 голосов
/ 22 марта 2019

В фактическом наборе данных доступны разные типы группового уровня. Нам потребуются разные типы групповых отчетов.(Примечание: групповой отчет не прост, поэтому, пожалуйста, внимательно прочитайте приведенный ниже пример)

Пример требования

, когда нам нужно сообщить отчет группы 4-го уровня, необходимо суммировать данныеполе до последнего значения до 4-го уровня.Номер отчета может быть любым номером, указанным в столбце «Группа». (Просьба обратиться к ожидаемому результату для большей ясности)

Для остальной части поля, обработка, как показано ниже:

дата покупки, Info1 & Info2: Самовывоздата доступна на уровне группы

данные : сумма

Фактическая база данных:

Group   purchase_date   Info1   Info2   data
2       03/23/2019      A       B       57
3       03/24/2019      A       B       48
4       03/25/2019      A       B       40
1       03/26/2019      Q       B       60
2       03/27/2019      Q       B       42
3       03/28/2019      Q       B       33
4       03/29/2019      Q       B       36
1       03/30/2019      R       B       54
2       03/31/2019      R       B       57
3       04/01/2019      R       B       53
4       04/02/2019      R       B       56
1       04/03/2019      A       B       48
2       04/04/2019      A       B       40
3       04/05/2019      A       B       45
4       04/06/2019      A       B       60
1       04/07/2019      A       B       38
2       04/08/2019      A       B       58

Ожидаемый результат после группировки данныхв соответствии с приведенным выше требованием:

4th group level report:             
Group   purchase_date   Info1   Info2   data
4       03/25/2019      A       B       145
4       03/29/2019      Q       B       171
4       04/02/2019      R       B       220
4       04/06/2019      A       B       193
4       04/08/2019      A       B       96

2nd group level Report
Group   purchase_date   Info1   Info2   data
2       03/23/2019      A       B       57
2       03/27/2019      Q       B       190
2       03/31/2019      R       B       180
2       04/04/2019      A       B       197
2       04/08/2019      A       B       201

Я пробовал это с группой по функции, но я не в состоянии запустить его.

Может ли кто-нибудь помочь мне получить желаемый результат?

Заранее спасибо.

1 Ответ

1 голос
/ 22 марта 2019

Со следующей функцией f(z, l) с параметром l, являющимся требуемым уровнем, и z, являющимся вашим DataFrame:

def f(z, l):
    x = (z['Group'] == l) | (z.index == z.index[-1])
    cs = z['data'].cumsum()
    dx = cs - cs.where(x, np.nan).ffill().shift(1).fillna(0)
    return z[x].drop('data', 1).assign(Group=l).join(dx)

print(f(df, 2))
print(f(df, 4))

Выход:

    Group purchase_date Info1 Info2   data
0       2    03/23/2019     A     B   57.0
4       2    03/27/2019     Q     B  190.0
8       2    03/31/2019     R     B  180.0
12      2    04/04/2019     A     B  197.0
16      2    04/08/2019     A     B  201.0


    Group purchase_date Info1 Info2   data
2       4    03/25/2019     A     B  145.0
6       4    03/29/2019     Q     B  171.0
10      4    04/02/2019     R     B  220.0
14      4    04/06/2019     A     B  193.0
16      4    04/08/2019     A     B   96.0

Он в основном вычисляеткумулятивные суммы с cumsum сбрасывают их каждый раз, когда мы нажимаем на запись с заданным уровнем или последней записью в DataFrame.

Обновление: , чтобы сделать последнюю строку в purchase_date всегдаравно предыдущему ряду + 4 дня:

def f(z, l):
    x = (z['Group'] == l) | (z.index == z.index[-1])
    cs = z['data'].cumsum()
    dx = cs - cs.where(x, np.nan).ffill().shift(1).fillna(0)
    zz = z[x].drop('data', 1).assign(Group=l).join(dx)
    zz['purchase_date'] = pd.to_datetime(zz['purchase_date'])
    zz.at[zz.index[-1], 'purchase_date'] = zz.at[zz.index[-2], 'purchase_date'] + pd.Timedelta('4d')
    return zz
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...