upper_triangle = np.triu(df.output.values < df.output.values[:, None])
df['s_until_dec'] = df['datetime'][upper_triangle.argmax(axis=1)].values - df['datetime']
df.loc[~upper_triangle.any(axis=1), 's_until_dec'] = np.nan
df
datetime output s_until_dec
0 2014-05-01 01:00:00 3 00:00:01
1 2014-05-01 01:00:01 2 00:00:03
2 2014-05-01 01:00:02 3 00:00:01
3 2014-05-01 01:00:03 2 00:00:01
4 2014-05-01 01:00:04 1 NaT
以下是它的工作原理:
df.output.values
df.output.values < df.output.values[:, None]
Out:
array([[False, True, False, True, True],
[False, False, False, False, True],
[False, True, False, True, True],
[False, False, False, False, True],
[False, False, False, False, False]], dtype=bool)
这里,例如,output [0]小于output [1],因此(0,1)的矩阵元素为True.我们需要上三角形,所以我用np.triu来得到这个矩阵的上三角形. argmax()会给我第一个True值的索引.如果我将其传递给iloc,我将得到相应的日期.当然除了最后一个.它有所有Falses所以我需要用np.nan替换它. .loc部分检查该情况的矩阵并替换为np.nan.