Пересмотренный ответ. Я считаю, что там может быть более короткий ответ. Может быть, поставить его в качестве данных за вознаграждение
df = pd.DataFrame({'timestamp':['2004-09-06', '2004-09-06', '2004-09-06', '2004-09-06', '2004-09-07', '2004-09-07'],
'opt_expiry': ['2005-12-16', '2005-12-16', '2005-12-16', '2005-12-16', '2005-06-17', '2005-06-17'],
'strike': [2, 2, 2.5, 2.5, 1.5, 1.5],
'type': ['c', 'p', 'c', 'p', 'c', 'p'],
'sigma': [0.25, 0.25, 0.001, 0.17, 0.195, 0.19],
'delta': [0.7, -0.3, 1, -0.25, 0.6, -0.4]}).set_index('timestamp', drop=True)
df
Рабочая
Абсолютная дельта-сумма для каждой группы для каждой строки
df['absdelta']=df['delta'].abs()
Абсолютная дельта-сумма и максимальная сигма для каждой группы в новый фрейм данных df2
df2=df.groupby(['timestamp','opt_expiry','strike']).agg({'absdelta':'sum','sigma':'max'})#.reset_index().drop(columns=['timestamp','opt_expiry'])
df2
Слияние df2
с df
df3=df.merge(df2, left_on='strike', right_on='strike',
suffixes=('', '_right'))
df3
групп масок с абсолютной дельтой суммы, не равной 1
m=df3['absdelta_right']!=1
m
Используя маску, примените максимальную сигма к объектам в группах, замаскированных выше
df3.loc[m,'sigma']=df3.loc[m,'sigma_right']
Срез для возврата к исходному фрейму данных
df3.iloc[:,:-4]
Вывод