我正在努力让计数器增加,因为我在几天内根据时间差异使用np.where处理一个Pandas系列。例如,如果我有一个包含以下值的系列:
Date Value
01/03/2017 5
02/03/2017 8
03/03/2017 3
04/03/2017 7
12/03/2017 1
13/03/2017 3
14/03/2017 4
我将通过此代码
转到一个看起来像这样的系列df['DIFF'] = df['Date'].diff()/np.timedelta64(1, 'D')
生成此数据框。
Date Value DIFF
01/03/2017 5 0
02/03/2017 8 1
03/03/2017 3 1
04/03/2017 7 1
12/03/2017 1 8
13/03/2017 3 1
14/03/2017 4 1
然后,我想创建一个计算生命数的生命周期,假设时间差大于4,那将是生命的新实例。
Date Value DIFF LIFETIME
01/03/2017 5 0 1
02/03/2017 8 1 1
03/03/2017 3 1 1
04/03/2017 7 1 1
12/03/2017 1 8 2
13/03/2017 3 1 2
14/03/2017 4 1 2
我想我差不多有这个代码
df['LIFE'] = np.where(df['DIFF'] >=4, life_counter=df.shift(-1)+1, df.shift(-1))
这里的逻辑是,如果DIFF大于或等于4,我会将LIFE变量设置为前一个+ 1.否则,它将与前一个值相同。这似乎是一种携带状态的巧妙方式。但是,我的循环似乎忽略了我设置的状态,可能是由于np.where的工作方式。有人知道如何做我正在做的事情并让它发挥作用。目前,我的输出看起来像这样。
Date Value DIFF LIFETIME
01/03/2017 5 0 1
02/03/2017 8 1 1
03/03/2017 3 1 1
04/03/2017 7 1 1
12/03/2017 1 8 2
13/03/2017 3 1 1
14/03/2017 4 1 1
答案 0 :(得分:5)
我相信你只想要一个布尔数组的累加和,加1
:
>>> df
Date Value DIFF
0 01/03/2017 5 0
1 02/03/2017 8 1
2 03/03/2017 3 1
3 04/03/2017 7 1
4 12/03/2017 1 8
5 13/03/2017 3 1
6 14/03/2017 4 1
>>> df['LIFETIME'] = np.cumsum(df.DIFF >= 4) + 1
>>> df
Date Value DIFF LIFETIME
0 01/03/2017 5 0 1
1 02/03/2017 8 1 1
2 03/03/2017 3 1 1
3 04/03/2017 7 1 1
4 12/03/2017 1 8 2
5 13/03/2017 3 1 2
6 14/03/2017 4 1 2