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

如何在Pandas中不使用iterrows()实现连续4行求和?

用Pandas向量化操作实现当前行及后续3行的求和

你想要的效果可以通过Pandas的rolling窗口结合反转操作高效实现,完全不需要iterrows()这类逐行循环,代码简洁且性能更优:

import pandas as pd
mpg_df = pd.read_csv('https://raw.githubusercontent.com/mwaskom/seaborn-data/master/mpg.csv')

# 生成special_sum列:当前行及后续3行的求和
mpg_df['special_sum'] = mpg_df['mpg'][::-1].rolling(window=4, min_periods=1).sum()[::-1]

原理说明

  • 先通过[::-1]反转mpg列的顺序,这样原需求里的「当前行+后续3行」就转换成了反转后的「当前行+前面3行」,刚好匹配rolling窗口默认的向前求和逻辑。
  • rolling(window=4, min_periods=1):窗口大小设为4(对应原需求的1+3行),min_periods=1确保当剩余行数不足4行时(比如最后3行),仍能计算现有行的总和,和你原代码里的边界判断逻辑完全一致。
  • 最后再次反转结果,就得到了和原代码一模一样的special_sum列。

为什么这是更优解

iterrows()是Python层面的逐行循环,每一次迭代都要做切片求和,效率极低(尤其是大数据集)。而上面的方法是Pandas向量化操作,内部用C语言实现计算,性能提升非常明显,这也是Pandas最佳实践里推荐的方式。

其他可选(但不推荐)的写法

如果你不想用反转+rolling,也可以通过多次shift实现,但代码会更繁琐,且窗口变大时扩展性差:

mpg_df['special_sum'] = (
    mpg_df['mpg']
    + mpg_df['mpg'].shift(-1).fillna(0)
    + mpg_df['mpg'].shift(-2).fillna(0)
    + mpg_df['mpg'].shift(-3).fillna(0)
)

至于你尝试的apply()+lambda,本质上还是行级循环,效率和iterrows()差不多,甚至更慢,所以不建议用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 16:53:14