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

pandas将连续持续时间列转换为开始和结束列

  •  0
  • lucky1928  · 技术社区  · 2 年前

    我想转换 duration 列到 start end 列。我尝试了下面的代码,它按预期工作,但不是一种完美的方式。

    import pandas as pd
    
    def main():
        data = [
            ['A',7],
            ['B',5],
            ['C',5],
            ['D',15],
            ['E',5]
            ]
    
        df = pd.DataFrame(data,columns=['name','duration'])
        data = []
        for idx,row in df.iterrows():
            name = row['name']
            dur = row['duration']
            if idx == 0:
                start = 0
                end = start + dur
            else:
                start = end
                end = start + dur
            data.append([name,start,dur,end])
        df = pd.DataFrame(data,columns=['name','start','duration','end'])
        print(df)
    
    main()    
    

    例外结果:

       name  start  duration  end
     0    A      0         7    7
     1    B      7         5   12
     2    C     12         5   17
     3    D     17        15   32
     4    E     32         5   37
    
    2 回复  |  直到 2 年前
        1
  •  1
  •   SteelFeather    2 年前

    只需使用cumsum计算跑步总次数,然后从持续时间中减去即可开始。

    df['end'] = df['duration'].cumsum() 
    df['start'] = df['end'] - df['duration']
    
        2
  •  1
  •   PaulS    2 年前

    一种可能的解决方案,它使用 cumsum 计算列 end ,因此计算列 start 由于列之间的差异 结束 duration :

    cols = ['name', 'start', 'duration', 'end']
    d = df.assign(end = df['duration'].cumsum())
    d.assign(start = d['end'] - d['duration'])[cols]
    

    输出:

      name  start  duration  end
    0    A      0         7    7
    1    B      7         5   12
    2    C     12         5   17
    3    D     17        15   32
    4    E     32         5   37