Pandas基于yoy同比增速与上年值批量计算多列当前值的方法
Pandas批量对多列同比增速计算对应实际值的方案
前置条件
你需要先确保数据集已经按日期列升序排序,且月度数据无断档(如有断档建议先将日期设为索引,用resample('M').asfreq()补全月份后再操作)。
实现方案
方案1:直接遍历列实现(无额外函数依赖,最简洁)
如果你还没封装函数,直接遍历筛选出的yoy列批量生成新列即可,仅需几行代码:
import pandas as pd # 1. 筛选所有yoy开头的列 yoy_cols = df.filter(regex="^yoy_").columns.tolist() # 2. 预计算上年同期value,避免每列重复计算偏移 df['ly_value'] = df['value'].shift(12) # 3. 批量生成计算结果列 for col in yoy_cols: df[f"{col}_value"] = (1 + df[col]) * df['ly_value'] # 可选:删除临时生成的上年value列 df.drop(columns=['ly_value'], inplace=True)
方案2:复用已有单组计算函数
如果你已经完成了单组计算的函数封装,可以通过apply批量应用到所有yoy列:
假设你已有的单组计算函数如下:
def calculate_yoy_actual(yoy_series: pd.Series, ly_value_series: pd.Series) -> pd.Series: # 你的自定义逻辑(含异常值处理、边界判断等均可保留) return (1 + yoy_series) * ly_value_series
批量调用代码:
ly_value = df['value'].shift(12) yoy_cols = df.filter(regex="^yoy_").columns # 批量计算所有列后直接合并到原DataFrame df = pd.concat([ df, df[yoy_cols].apply(calculate_yoy_actual, args=(ly_value,)).add_suffix("_value") ], axis=1)
注意事项
- 如果你的数据存在缺失月份,直接用
shift(12)会出现匹配错误,需要先将日期设为索引,重采样补全缺失月份后再执行计算 - 所有yoy列的数值格式需要是小数格式(比如同比增长15%对应值为0.15),如果是百分比字符串需要先转换为数值再计算
内容的提问来源于stack exchange,提问作者ah bon
相关产品推荐
相关产品推荐

