如何用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
相关产品推荐
相关产品推荐

