DataFrame自最后一个正值和最后一个负值以来的时间



我有一个输入数据框,看起来像这样:

df = pd.DataFrame.from_dict({"t": [1,2,3,4,5], 'val': [100, 5, -4, -9, 1], })

我需要计算以下两列,一列表示自最后一个正值以来的时间,另一列表示自最后一个负值以来的时间:

df['t_since_neg'] = [np.nan, np.nan, np.nan, 1, 1]
df['t_since_pos'] =  [np.nan, 1, 1,2,3]

t列表示时间。我该怎么做呢?我知道这将与diff有关,但我无法使它完全工作。

更新(后续问题):如果我有一个额外的列' id ',我该如何做到这一点,并且计算需要在每组内单独完成,即每组是相互独立的?

解决方案

m = df.val > 0
df['t_since_neg'] = df['t'] - df['t'].where(~m).ffill().shift()
df['t_since_pos'] = df['t'] - df['t'].where( m).ffill().shift()

t  val  t_since_neg  t_since_pos
0  1  100          NaN          NaN
1  2    5          NaN          1.0
2  3   -4          NaN          1.0
3  4   -9          1.0          2.0
4  5    1          1.0          3.0

解释计算t_since_pos时,先掩码val为负值的时间列中的值,然后前向填充移位传播最后一个正值对应的时间,最后在原时间列中减去该值。同样的方法可以用来计算t_since_neg

>>>  df['t'].where(m)
0    1.0
1    2.0
2    NaN
3    NaN
4    5.0
Name: t, dtype: float64
>>> .ffill().shift()
0    NaN
1    1.0
2    2.0
3    2.0
4    2.0
Name: t, dtype: float64

最新更新