Pandas: как выровнять/центрировать столбец даты и агрегировать другой столбец в любом направлении даты?

Как выровнять/центрировать столбец даты фрейма данных (и связанные с ним строки) на основе события (другого значения столбца).

Объяснение на примере: У меня есть фрейм данных, как показано ниже.

Что я пытаюсь сделать, так это центрировать столбец даты на основе столбца event. В данном случае 3/12/12 является центром.

Затем мне нужно среднее значение от center - 2months (21) и center + 2months (30,5)

df=pd.DataFrame([
        ['1/10/12',No, 20],
        ['2/11/12',No, 22],
        ['3/12/12',Yes, 29],
        ['4/14/12',No, 30],
        ['5/14/12',No, 31]
        ],
        columns=['Time', 'event', 'value'])

В приведенном выше случае результирующий фрейм данных будет:

df=pd.DataFrame([
        ['pre_center', 20],
        ['center', 22],
        ['post_center', 30.5]
        ],
        columns=['Range', 'average_value'])
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
91
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать:

# convert to datetime
s = pd.to_datetime(df['Time'])

# identify the center
center = s[df['event'].eq('Yes')].iloc[0]

# identify if the date is before/center/after
group = (np.sign(s.sub(center).dt.days.astype(int))
           .map({-1: 'pre_center', 0: 'center', 1: 'post_center'})
        )

# aggregate
out = df.groupby(group)['value'].agg(average_value='sum')

Выход:

         Range  average_value
0       center             29
1  post_center             61
2   pre_center             42

Если вы хотите включить порог:

s = pd.to_datetime(df['Time'])

center = s[df['event'].eq('Yes')].iloc[0]

diff = pd.DateOffset(months=2)
m1 = s.between(center-diff, center)
m2 = s.between(center, center+diff)
group = np.select([m1&m2, m1, m2], ['center', 'pre_center', 'post_center'], np.nan)

out = (df.groupby(group)['value']
         .agg(average_value='sum')
         .drop('nan', errors='ignore')
         .rename_axis('Range').reset_index()
      )

Выход:

         Range  average_value
0       center             29
1  post_center             30
2   pre_center             22

Я получаю сообщение об ошибке «невозможно ввести дату и время от [timedelta64 [ns]] до [int32]»

Salih 23.11.2022 09:51

спасибо @jezrael и @mozway! @jezrael, я не вижу разницы между threshold и center. Где это было бы выгодно?

Salih 23.11.2022 10:33

@Salih, который нужно было удалить, извините, порог на самом деле diff

mozway 23.11.2022 10:35

Другие вопросы по теме