代码之家  ›  专栏  ›  技术社区  ›  SkyWalker

如何计算自列标志起的天数?

  •  0
  • SkyWalker  · 技术社区  · 3 年前

    我有一个如下定义的数据帧。我想数一数 input 列从1更改为0:

    import pandas as pd
    df = pd.DataFrame({'input': [1,1,1,0,0,0,1,1,1,0,0,0]}, 
                      index=pd.date_range('2021-10-01', periods=12))
    # I can mark the points of interest, i.e. when it goes from 1 to 0
    df['change'] = 0
    df.loc[(df['input'].shift(1) - df['input']) > 0, 'change'] = 1
    print(df)
    

                input   change
    2021-10-01      1        0
    2021-10-02      1        0 
    2021-10-03      1        0
    2021-10-04      0        1
    2021-10-05      0        0
    2021-10-06      0        0
    2021-10-07      1        0
    2021-10-08      1        0
    2021-10-09      1        0
    2021-10-10      0        1
    2021-10-11      0        0
    2021-10-12      0        0
    

    我想要的是一个 res 输出:

                input   change     res
    2021-10-01      1        0       0
    2021-10-02      1        0       0  
    2021-10-03      1        0       0
    2021-10-04      0        1       1
    2021-10-05      0        0       2
    2021-10-06      0        0       3
    2021-10-07      1        0       0
    2021-10-08      1        0       0
    2021-10-09      1        0       0
    2021-10-10      0        1       1
    2021-10-11      0        0       2
    2021-10-12      0        0       3
    

    cumsum 但没有找到在适当的点“重置它”的方法:

    df['res'] = (1 - df['input']).cumsum()*(1 - df['input'])
    

    但上述情况将继续累积,而不会在何处重置 change == 1

    1 回复  |  直到 3 年前
        1
  •  0
  •   Henry Ecker Super Kai - Kazuya Ito    3 年前

    我们只能在以下位置创建布尔级数: input eq 0 group by consecutive values 拿着这个 groupby cumsum 布尔级数的。这本质上是枚举组,但仅枚举中有0的组 输入

    :

    m = df['input'].eq(0)
    df['res'] = m.groupby(m.ne(m.shift()).cumsum()).cumsum()
    

    df :

                input  change  res
    2021-10-01      1       0    0
    2021-10-02      1       0    0
    2021-10-03      1       0    0
    2021-10-04      0       1    1
    2021-10-05      0       0    2
    2021-10-06      0       0    3
    2021-10-07      1       0    0
    2021-10-08      1       0    0
    2021-10-09      1       0    0
    2021-10-10      0       1    1
    2021-10-11      0       0    2
    2021-10-12      0       0    3