【问题标题】:If statement using Numpy.Where and Pandas.Shift in Python在 Python 中使用 Numpy.Where 和 Pandas.Shift 的 If 语句
【发布时间】:2019-12-11 17:47:11
【问题描述】:

我有一个类似于下面的 DataFrame。我正在尝试计算它从 False 切换到 True 的次数的滚动计数。

Time   True/False
 1         0
 2         1
 3         1
 4         0
 5         0
 6         0
 7         1
 8         1
 9         0
 10        1
 11        0

下面的代码是我使用 ``numpy.where 得出的,但我没有得到我想要的结果。

Test['RollingCount'] = np.where(Test['True/False'] == 0, Test['RollingCount'].shift(1),
                       np.where((Test['True/False'] == 1) & (Test['True/False'].shift(1) == 1), Test['RollingCount'].shift(1),
                       np.where((Test['True/False'] == 1) & (Test['True/False'].shift(1) == 0), (Test['RollingCount'].shift(1) + 1),
                       np.where(Test['True/False'] == 1, 1, 0))))

下面是我想要完成的输出。知道我做错了什么吗?有没有更好的方法来解决这个问题?

Time   True/False   RollingCount
 1         0              0
 2         1              1
 3         1              1
 4         0              1
 5         0              1
 6         0              1
 7         1              2
 8         1              2
 9         0              2
 10        1              3
 11        0              3

【问题讨论】:

    标签: python-3.x numpy dataframe if-statement lambda


    【解决方案1】:

    IIUC:

    df['RollingCount'] = df['True/False'].diff(-1).eq(1).cumsum()
    

    输出:

    0     0
    1     0
    2     1
    3     1
    4     1
    5     1
    6     1
    7     2
    8     2
    9     3
    10    3
    Name: True/False, dtype: int32
    

    【讨论】:

      【解决方案2】:

      在 numpy 中,您可以使用 diffcumsum 执行此操作:

      d = np.concatenate(([0], np.diff(tf)))
      result = np.cumsum(d[d > 0])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多