Я не уверен, что получил подробные данные вопроса на 100%, но, вероятно, следующее может показать, как подойти к нему.
Предположим, вы начинаете с
df = pd.DataFrame({'timestamp': range(9), 'value': [36, 68, 131, 94, -1000, 100, 540, -100, 54]})
Используйтестолбец-пустышка для выполнения самостоятельного внешнего соединения:
df['dummy'] = 1
merged = pd.merge(df, df, on='dummy', how='outer')
Теперь рассчитайте для каждой временной отметки, существует ли другое отрицательное значение, самое большее отличающееся от него, в абсолютном значении самое большее на расстоянии 10:
merged['has_a_matching_minus'] = (merged.timestamp_x != merged.timestamp_y) & (merged.value_y < 0) & ((merged.value_x.abs() - merged.value_y.abs()).abs() < 10)
>>> merged.has_a_matching_minus.astype(int).groupby(merged.timestamp_x).max().astype(bool).to_frame()
has_a_matching_minus
timestamp_x
0 False
1 False
2 False
3 True
4 False
5 True
6 False
7 False
8 False
Вы можете легко merge
это в оригинальную рамку.Если вам нужно несколько столбцов, выполните их вычисления для merged
аналогично.