如何在pandas DataFrame中计算并新增GDP年化增长率列
Pandas 批量计算GDP年化增长率的最佳实现
不要用iterrows()逐行遍历处理这类相邻行计算场景,pandas内置的向量化接口可以一行代码完成需求,运行效率更高、不会出现索引越界问题,计算结果完全匹配你的预期。
实现代码
import pandas as pd # 构造你给出的示例数据集 df = pd.DataFrame({ 'GDP': [100, 101, 103, 107] }) # 新增年化增长率列,索引0位置自动填充NaN df['Annualized Growth Rate'] = ((df['GDP'] / df['GDP'].shift(1)) ** 4 - 1) * 100 # 如果需要和示例一样保留3位小数,追加round即可 # df['Annualized Growth Rate'] = df['Annualized Growth Rate'].round(3)
运行后输出的数据集和你给出的预期完全一致:
| 索引 | GDP | Annualized Growth Rate |
|---|---|---|
| 0 | 100 | NaN |
| 1 | 101 | 4.060 |
| 2 | 103 | 8.159 |
| 3 | 107 | 16.462 |
原代码报错原因
你之前写的iterrows()循环逻辑存在三个明显问题:
- 遍历到索引0时,代码尝试取
index-1 = -1对应的行,你的DataFrame不存在-1这个索引标签,直接触发索引越界报错 - 循环内的赋值逻辑错误:
df['Annualized Growth Rate'] = 单个值的写法每次循环都会覆盖整列数据,哪怕不报错最终整列也只会保留最后一次循环的计算结果 iterrows()属于逐行执行的非向量化实现,数据量越大运行速度越慢,不符合pandas使用规范,所有批量行列计算场景都不优先考虑。
等价简化写法
pandas内置了pct_change()方法专门计算环比变化率,和上述写法结果完全一致,代码更简洁:
df['Annualized Growth Rate'] = ((1 + df['GDP'].pct_change()) ** 4 - 1) * 100
注意事项
- 计算前请确认DataFrame已经按时间先后顺序排序,否则会出现跨期计算错误
- 如果数据中存在GDP缺失值,上述方法会自动在缺失值对应的行及下一行返回NaN,不需要额外写异常判断逻辑
内容的提问来源于stack exchange,提问作者Luke Eisenhardt
相关产品推荐
相关产品推荐

