Создайте столбец, который группирует и преобразует данные за день до этого

#python #pandas #dataframe

Вопрос:

Мне нужно создать новый столбец, который будет группироваться по ColA, и результатом будет суммирование значений в ColC за день до этого-пример ниже:

Оригинальный DF

 ColA ColB ColC  A 10/20/2021 2  A 10/20/2021 8  A 10/21/2021 1  A 10/21/2021 5  A 10/22/2021 3  A 10/22/2021 4  B 10/20/2021 9  B 10/20/2021 1  B 10/21/2021 6  B 10/21/2021 4   B 10/22/2021 2  B 10/22/2021 7   C 10/20/2021 6  C 10/20/2021 3  C 10/21/2021 8  C 10/21/2021 8  C 10/22/2021 2  C 10/22/2021 6  

Желаемый DF, где новая колонка холодная

 ColA ColB ColC ColD  A 10/20/2021 2 NA  A 10/20/2021 8 NA  A 10/21/2021 1 10  A 10/21/2021 5 10  A 10/22/2021 3 6  A 10/22/2021 4 6  B 10/20/2021 9 NA  B 10/20/2021 1 NA  B 10/21/2021 6 10  B 10/21/2021 4 10  B 10/22/2021 2 10  B 10/22/2021 7 10  C 10/20/2021 6 NA  C 10/20/2021 3 NA  C 10/21/2021 8 9  C 10/21/2021 8 9  C 10/22/2021 2 16  C 10/22/2021 6 16  

Любые предложения приветствуются!

Комментарии:

1. «Накануне» — это ровно на один день раньше или на предыдущую дату?

Ответ №1:

Сначала преобразуйте свою дату в a datetime . Затем группы «КолА» и «КолБ» сдвинулись ровно на один день. Таким образом, когда вы объединяете результат groupby обратной стороны, он выравнивается на один день раньше.

 import pandas as pd  df['ColB'] = pd.to_datetime(df['ColB'], format='%m/%d/%Y')  s = (df.groupby(['ColA', df['ColB'] pd.offsets.DateOffset(days=1)])  ['ColC'].sum().rename('ColD'))  df = df.merge(s, on=['ColA', 'ColB'], how='left')  

 print(df)   ColA ColB ColC ColD 0 A 2021-10-20 2 NaN 1 A 2021-10-20 8 NaN 2 A 2021-10-21 1 10.0 3 A 2021-10-21 5 10.0 4 A 2021-10-22 3 6.0 5 A 2021-10-22 4 6.0 6 B 2021-10-20 9 NaN 7 B 2021-10-20 1 NaN 8 B 2021-10-21 6 10.0 9 B 2021-10-21 4 10.0 10 B 2021-10-22 2 10.0 11 B 2021-10-22 7 10.0 12 C 2021-10-20 6 NaN 13 C 2021-10-20 3 NaN 14 C 2021-10-21 8 9.0 15 C 2021-10-21 8 9.0 16 C 2021-10-22 2 16.0 17 C 2021-10-22 6 16.0  

Ответ №2:

Делаем а groupby потом мы shift его внутри колы и merge обратно

 out = df.merge(df.groupby(['ColA','ColB'])['ColC'].sum().groupby(level=0).shift().reset_index(name='ColD')) Out[71]:   ColA ColB ColC ColD 0 A 10/20/2021 2 NaN 1 A 10/20/2021 8 NaN 2 A 10/21/2021 1 10.0 3 A 10/21/2021 5 10.0 4 A 10/22/2021 3 6.0 5 A 10/22/2021 4 6.0 6 B 10/20/2021 9 NaN 7 B 10/20/2021 1 NaN 8 B 10/21/2021 6 10.0 9 B 10/21/2021 4 10.0 10 B 10/22/2021 2 10.0 11 B 10/22/2021 7 10.0 12 C 10/20/2021 6 NaN 13 C 10/20/2021 3 NaN 14 C 10/21/2021 8 9.0 15 C 10/21/2021 8 9.0 16 C 10/22/2021 2 16.0 17 C 10/22/2021 6 16.0  

Комментарии:

1. Спасибо! Я попробую это сделать. Вы ожидаете, что это сработает, если в фрейме данных есть другие столбцы, которые не связаны с этим усилием?

2. @dmd7 будет работать