Pandas为DataFrame新增列计算间隔4行的年度同比差值
实现方案
pandas原生提供了位移计算方法,完全不需要写逐行循环,代码更简洁、性能更高,也不会出现手动维护列表、索引导致的bug。
基础快速实现
季度频率数据的年度同比对应滞后4期的差值,直接用shift(4)对目标列做位移后做差即可,前4行无上年同期数据会自动填充NaN,和你现有循环逻辑的计算结果完全一致:
# 单个DataFrame处理,一行代码完成列新增 df['Percentage point change'] = df['Capital buffer rate (%)'] - df['Capital buffer rate (%)'].shift(4)
基于你给出的示例数据,计算结果如下:
| Quarter | Capital buffer rate (%) | Percentage point change |
|---|---|---|
| 2019-03 | 38 | NaN |
| 2019-06 | 43 | NaN |
| 2019-09 | 38 | NaN |
| 2019-12 | 37 | NaN |
| 2020-03 | 37 | -1 |
| 2020-06 | 37 | -6 |
| 2020-09 | 37 | -1 |
| 2020-12 | 35 | -2 |
| 2021-03 | 37 | 0 |
| 2021-06 | 41 | 4 |
| 2021-09 | 43 | 6 |
| 2021-12 | 44 | 9 |
批量处理多份数据集
把5份不同机构类型的DataFrame统一存入列表,循环处理即可,不需要为每个数据集单独创建临时变量、存储列表:
# 示例:df_list = [投资公司数据集, 银行数据集, 证券机构数据集, ...] for temp_df in df_list: temp_df['Percentage point change'] = temp_df['Capital buffer rate (%)'] - temp_df['Capital buffer rate (%)'].shift(4)
高鲁棒性实现(推荐)
如果存在数据集季度缺失、行顺序错乱的可能,不要硬编码位移行数,先将Quarter列转为时间类型并设为索引,基于时间偏移做对齐计算,完全避免行位置异常导致的计算错误:
for temp_df in df_list: # 转换季度列为时间格式,排序后设为索引 temp_df['Quarter'] = pd.to_datetime(temp_df['Quarter']) temp_df = temp_df.set_index('Quarter').sort_index() # 按1年时间偏移做位移,自动匹配上年同期数据,缺失值自动返回NaN temp_df['Percentage point change'] = temp_df['Capital buffer rate (%)'] - temp_df['Capital buffer rate (%)'].shift(freq='1Y') # 不需要时间索引的话可以重置回普通列 temp_df = temp_df.reset_index()
该实现不依赖数据的物理行位置,哪怕数据集中缺少部分季度、行顺序被打乱,计算结果依然准确,适合生产环境使用。
内容的提问来源于stack exchange,提问作者cocobolo
相关产品推荐
相关产品推荐

