我有一个大的ass时间序列数据帧,其中一个条件以可变的间隔变化。我想用每个新条件将时间归零,所以我将类别转换为整数,并使用.diff((创建了一个新列,以指示出现非零值切换的行。然后我做了一个新的专栏,";Mod_time";作为在每个新条件下为零的新时间值的容器。这就是我想要的表格的样子:
时间 | 条件 | 数值条件 | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
0 | Apples | >nan | |||||||||
1 | 苹果 | 6 | <1>|||||||||
2 | 苹果 | 6 | 3 | 苹果 | 6 | 4 | 橙色 | 2 | 4>0 | //tr>||
5 | 橙色 |
有各种各样的问题涉及带重置的累积和。这一点可以这样看:你想做时间差的累积和,当";数值条件";更改。
import numpy as np
def cumsum_reset(v, reset):
v = v.copy()
c = np.cumsum(~reset)
v[reset] = -np.diff(np.r_[0, c[reset]])
return np.cumsum(v)
# application
cond = df['Numerical Condition']
df['Mod_time'] = cumsum_reset(np.diff(np.r_[0, df['Time']]),cond != cond.shift())
关于您的数据:
Time Condition Numerical Condition Fruit_switch Mod_time
0 0 Apples 6 NaN 0
1 1 Apples 6 0.0 1
2 2 Apples 6 0.0 2
3 3 Apples 6 0.0 3
4 4 Oranges 2 -4.0 0
5 5 Oranges 2 0.0 1
编辑
从评论中可以看出,当df['Condition']
(水果名称(发生变化时,似乎真的应该进行重置。此外,行之间的时间差总是一。因此,以下内容也应该起作用:
c = df['Condition']
df['Mod_time'] = cumsum_reset(np.ones_like(c), c.shift() != c)