如何用Lambda函数批量创建Pandas中的增长率列?
批量生成Pandas DataFrame增长率列的方法
首先修正你的示例数据,把consumption列加入DataFrame,确保后续代码能正常运行:
import pandas as pd consumption = [5, 10, 15, 20, 25, 30, 35, 40] wage = [10, 20, 30, 40, 50, 60, 70, 80] period = [1, 2, 3, 4, 5, 6, 7, 8] id = [1, 1, 1, 1, 1, 1, 1, 1] # 修正zip包含所有列 tup = list(zip(id, period, wage, consumption)) df = pd.DataFrame(tup, columns=['id', 'period', 'wage', 'consumption'])
方法一:for循环遍历目标列(直观易理解)
先提前完成排序和分组操作,避免重复执行浪费资源,再遍历需要计算增长率的列:
# 先排序并分组,只执行一次 sorted_grouped = df.sort_values(by=['id', 'period']).groupby(['id']) # 定义需要计算增长率的列(排除id、period这类非数值列) target_cols = ['wage', 'consumption'] # 遍历列批量生成增长率列 for col in target_cols: df[f'{col}_chg'] = sorted_grouped[col].apply(lambda x: (x / x.shift(4) - 1)).fillna(0)
方法二:批量生成后合并(更高效,适合大量列)
如果你的DataFrame有上百列,用pd.concat一次性生成所有增长率列,效率更高:
# 排序分组后,对目标列批量计算增长率 sorted_grouped = df.sort_values(by=['id', 'period']).groupby(['id']) target_cols = ['wage', 'consumption'] # 批量生成增长率DataFrame,列名自动加上_chg chg_df = sorted_grouped[target_cols].apply(lambda x: (x / x.shift(4) - 1)).fillna(0).add_suffix('_chg') # 合并回原DataFrame df = pd.concat([df, chg_df], axis=1)
实用技巧
- 自动筛选目标列:如果需要处理所有数值列,可自动获取并排除不需要计算的列,比如:
target_cols = [col for col in df.select_dtypes(include=['number']).columns if col not in ['id', 'period']] - 调整偏移量:
shift(4)对应跨4期的增长率,若需环比(上一期),改成shift(1)即可,可根据业务需求灵活调整。
内容的提问来源于stack exchange,提问作者Slavoj
相关产品推荐
相关产品推荐

