Как выровнять/центрировать столбец даты фрейма данных (и связанные с ним строки) на основе события (другого значения столбца).
Объяснение на примере: У меня есть фрейм данных, как показано ниже.
Что я пытаюсь сделать, так это центрировать столбец даты на основе столбца 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'])
Вы можете использовать:
# 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
спасибо @jezrael и @mozway! @jezrael, я не вижу разницы между threshold
и center
. Где это было бы выгодно?
@Salih, который нужно было удалить, извините, порог на самом деле diff
Я получаю сообщение об ошибке «невозможно ввести дату и время от [timedelta64 [ns]] до [int32]»