如何在Python Pandas中无需循环基于历史值生成新时间序列?
Pandas高效计算每日累计事件量(替代for循环)
我已知晓如何用Python的for循环解决该问题,但想了解Pandas中是否有更高效的实现方式。
问题描述
假设有两个带日期索引的Pandas Series——in和out,每个日期对应一个整数值。示例如下:
# in Series date val 2022-12-01 5 2022-12-02 8 2022-12-03 19
# out Series date val 2022-12-01 3 2022-12-02 7 2022-12-03 21
需要生成一个名为open的Series,记录每日处理的事件量,计算规则为:
- 首日值:
open.iloc[0] = in.iloc[0] - out.iloc[0] - 后续每日:
open.iloc[i] = open.iloc[i-1] + in.iloc[i] - out.iloc[i]
预期结果:
# open Series date val 2022-12-01 2 # 5-3 2022-12-02 3 # 2+8-7 2022-12-03 1 # 3+19-21
请问能否在Pandas中实现该需求,无需使用for循环?
当然可以,Pandas的cumsum()方法就能高效实现这个需求,完全不需要for循环。
核心思路是:每日的in - out差值的累计和,正好匹配你的计算规则。具体步骤如下:
- 先计算每日的净差值:
net = in['val'] - out['val'] - 对
net做累计求和,得到的结果就是openSeries的val列
代码示例:
import pandas as pd # 构造示例数据 in_series = pd.Series([5, 8, 19], index=pd.date_range('2022-12-01', periods=3), name='val') out_series = pd.Series([3, 7, 21], index=pd.date_range('2022-12-01', periods=3), name='val') # 计算每日净差值 net = in_series - out_series # 累计求和得到open Series open_series = net.cumsum().rename('val').to_frame('val') print(open_series)
运行结果与预期完全一致:
val 2022-12-01 2 2022-12-02 3 2022-12-03 1
这种方法是Pandas原生的向量化操作,比for循环效率高得多,数据量越大优势越明显。
内容的提问来源于stack exchange,提问作者Wannes
相关产品推荐
相关产品推荐

