You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Pandas将duration列转换为start和end列?优化代码

优化DataFrame中duration转start/end列的实现方案

你原来用iterrows()循环的方式虽然能得到结果,但在数据量较大时效率很低——iterrows()是逐行迭代,没有利用pandas的向量化运算优势。下面是更高效的实现方案,直接用pandas内置的累计求和函数完成:

import pandas as pd

def main():
    data = [
        ['A',7],
        ['B',5],
        ['C',5],
        ['D',15],
        ['E',5]
    ]
    df = pd.DataFrame(data, columns=['name','duration'])
    
    # 计算start列:取duration累计和的前一个值,首行填充0
    df['start'] = df['duration'].cumsum().shift(fill_value=0)
    # 计算end列:直接对duration做累计求和
    df['end'] = df['duration'].cumsum()
    
    # 调整列顺序匹配预期结果
    df = df[['name', 'start', 'duration', 'end']]
    print(df)

main()

代码说明

  • df['duration'].cumsum():计算duration列的累计求和结果,这正好对应每一行的end值(end是从0开始累加当前及之前所有duration的总和)
  • shift(fill_value=0):将累计和结果整体向下偏移一行,首行用0填充,得到的就是每一行的start值(start等于上一行的end)
  • 整个过程是向量化运算,比逐行循环的效率提升非常明显,尤其当DataFrame行数很多时优势更突出

运行后输出结果和你预期的完全一致:

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

内容的提问来源于stack exchange,提问作者lucky1928

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 17:12:33