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

基于另一列的值创建列

  •  1
  • Saeed  · 技术社区  · 2 年前

    请考虑此数据帧:

    import pandas as pd
    import numpy as np
    
    values = [0, 22, 30, 0, 20, 22, 11, 0, 13]
    index = pd.date_range(start = '2023-10-1', periods = len(values))
    
    df = pd.DataFrame({'values':values }, index = index)
    
    df
               values
    2023-10-01  0
    2023-10-02  22
    2023-10-03  30
    2023-10-04  0
    2023-10-05  20
    2023-10-06  22
    2023-10-07  11
    2023-10-08  0
    2023-10-09  13
    

    目标: 创建一个新列,统计自中最后一个0以来已过去的天数 values

    我可以使用for循环来完成此操作:

    zero_indices = df[df['values'] == 0].index
    df['days'] = np.nan
    
    for i in range(len(zero_indices)-1):
        df['days'][zero_indices[i]: zero_indices[i+1]] = range(len(df[zero_indices[i]: zero_indices[i+1]]))
    df['days'][zero_indices[-1]: ] = range(len(df[zero_indices[-1]: ]))
    
    
               values   days
    2023-10-01  0   0.00
    2023-10-02  22  1.00
    2023-10-03  30  2.00
    2023-10-04  0   0.00
    2023-10-05  20  1.00
    2023-10-06  22  2.00
    2023-10-07  11  3.00
    2023-10-08  0   0.00
    2023-10-09  13  1.00
    

    问题 :如何使用矢量化(更快)实现这一点?

    1 回复  |  直到 2 年前
        1
  •  1
  •   Suraj Shourie    2 年前

    有很多方法可以做到这一点,其中一种解决方案是使用 groupby cumcount :

    df['temp'] = (df.values == 0).cumsum()
    df.groupby(['temp']).cumcount() # this just gives the cumulative count since the last 0 value
    

    输出:

    2023-10-01    0
    2023-10-02    1
    2023-10-03    2
    2023-10-04    0
    2023-10-05    1
    2023-10-06    2
    2023-10-07    3
    2023-10-08    0
    2023-10-09    1
    Freq: D, dtype: int64