【问题标题】:Incrementing a counter based on some value with np.where使用 np.where 根据某个值递增计数器
【发布时间】:2017-06-19 12:11:29
【问题描述】:

当我使用 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

【问题讨论】:

    标签: python pandas numpy


    【解决方案1】:

    我相信您只是想要一个布尔数组上的累积和,并由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
    

    【讨论】:

    • 啊,非常好! :D 这是一个更好的解决方案,因为在使用 np.where 时出现状态问题
    • @Eamonn 我不确定您所说的“状态问题”是什么意思,但我认为您的意思是,life_counter=df.shift(-1)+1, df.shift(-1) 在调用函数之前被评估。
    • 是的,完全正确。所以即使前一个生命值的“状态”改成2,下一行评估也看不到。
    猜你喜欢
    • 2013-03-07
    • 2021-12-08
    • 1970-01-01
    • 2023-03-16
    • 2018-12-08
    • 2015-12-24
    • 2023-02-19
    • 2012-02-09
    • 1970-01-01
    相关资源
    最近更新 更多