如何在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
相关产品推荐
相关产品推荐

