繁体   English   中英

DataFrame - 自上次正值和上次负值以来的时间

[英]DataFrame - time since last positive and last negative value

我有一个如下所示的输入数据框:

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 ,首先屏蔽 time 列中相应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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM