按组高效遍历日期:优化百万级数据期初余额计算
高效计算各ID的期初余额
你的核心需求是用每个ID前一日的期末余额计算当日期初余额,原代码的双重循环在50万条数据下效率极低,主要原因是手动遍历+loc逐行赋值的方式完全没有利用pandas的矢量化优势。
最优解决方案:利用pandas分组移位操作
直接使用groupby+shift的矢量化操作,避免任何Python层面的循环,处理百万级数据都能秒级完成:
# 第一步:确保数据按ID和日期排序(这是关键,否则移位会出错) df = df.sort_values(['ID', 'Date']) # 第二步:分组后将期末余额向下移位一行,得到期初余额,并用0填充每个ID的第一日期期初 df['Opening Bal'] = df.groupby('ID')['Ending Bal'].shift(1).fillna(0)
为什么这个方法更快?
groupby('ID')会把数据按ID分组,确保每个ID的日期序列独立处理shift(1)是pandas底层优化的矢量化操作,直接将每个分组的Ending Bal列整体向下移动一行,相当于把前一天的期末余额放到当日的期初位置fillna(0)自动给每个ID的第一笔记录填充期初余额0,和你原代码中k=0的逻辑一致
原代码的问题分析
- 双重循环遍历
id_list和date_list,循环次数等于ID数量×日期数量,50万条数据下这个次数可能达到数万甚至数十万,Python循环本身就慢 - 每次循环调用
df.loc[...]进行切片赋值,这是非常耗时的操作——pandas每次切片都会生成新的对象,频繁赋值会产生大量内存开销 - 代码中存在笔误:
dfx应该是df,ID)多了一个右括号,这些小问题也会导致运行异常
内容的提问来源于stack exchange,提问作者Tony
相关产品推荐
相关产品推荐

