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

按组高效遍历日期:优化百万级数据期初余额计算

高效计算各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的逻辑一致

原代码的问题分析

  1. 双重循环遍历id_list和date_list,循环次数等于ID数量×日期数量,50万条数据下这个次数可能达到数万甚至数十万,Python循环本身就慢
  2. 每次循环调用df.loc[...]进行切片赋值,这是非常耗时的操作——pandas每次切片都会生成新的对象,频繁赋值会产生大量内存开销
  3. 代码中存在笔误:dfx应该是df,ID)多了一个右括号,这些小问题也会导致运行异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 12:39:27