如何使用Pandas高效计算各时间步所有物品最新数量总和
高性能Pandas实现方案
实现思路
- 全程采用Pandas内置向量化运算,完全避免Python层遍历,十万级以上数据量下性能是循环、apply类实现的数十到上百倍
- 利用分组位移计算每个物品的历史值差值,累加差值即可直接得到截止到当前时间步所有物品最新值的总和,逻辑简洁且无冗余计算
完整实现代码
import pandas as pd # 假设输入df为包含timestep、article、volume三列的原始DataFrame # 第一步:按时间步升序排序,保证处理顺序符合要求 df = df.sort_values('timestep', ignore_index=True) # 第二步:计算每个物品上一次出现的数量值,首次出现的物品历史值填充为0 df['prev_vol'] = df.groupby('article')['volume'].shift(fill_value=0) # 第三步:计算当前行的增量:当前数量 减去 该物品上一次的数量 df['delta'] = df['volume'] - df['prev_vol'] # 第四步:对增量累加求和,得到截止到当前时间步的所有物品最新值总和 df['volume'] = df['delta'].cumsum() # 输出仅保留需要的两列 result = df[['timestep', 'volume']]
结果验证
用你提供的示例数据运行后,完整输出结果如下(你给出的示例输出漏了timestep=155的行,代码会默认保留所有时间步,若不需要可根据业务规则额外过滤):
| timestep | volume |
|---|---|
| 35 | 20 |
| 37 | 25 |
| 123 | 32 |
| 155 | 42 |
| 178 | 53 |
| 234 | 50 |
| 478 | 61 |
内容的提问来源于stack exchange,提问作者sekr
相关产品推荐
相关产品推荐

