使用np.where

时间:2017-06-19 12:11:29

标签: python pandas numpy

我正在努力让计数器增加,因为我在几天内根据时间差异使用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

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