如何高效计算Pandas DataFrame分组列的百分比变化
优化实现方案
1 原有代码的问题
- 冗余计算:遍历所有q1/q2/q3列时,同一个指标组会被重复计算3次
- 拼接错误:
pd.concat(dflist)默认按行拼接,会生成3倍原表行数的结果,存在大量空值,不符合列拼接的需求
2 更简洁的连续季度百分比变化实现
方案1:遍历唯一指标后缀(易理解)
# 提取所有唯一的指标后缀(去掉q1_/q2_/q3_前缀后的部分) metric_suffixes = list({col.split('_', 1)[1] for col in df.columns if col.startswith(('q1_', 'q2_', 'q3_'))}) dflist = [] for suffix in metric_suffixes: # 按季度顺序取同一指标的三列 group_cols = [f'q{i}_{suffix}' for i in [1,2,3]] # axis=1 沿列方向计算环比 pct = df[group_cols].pct_change(axis=1).add_suffix('_PCT_CHG') dflist.append(pct) # 按列拼接所有结果 pcts_df = pd.concat(dflist, axis=1)
方案2:多级索引向量化实现(无循环,性能更高)
通过把列名拆为季度、指标两级索引,直接沿季度维度批量计算:
df_process = df.copy() # 列名拆分为[季度, 指标]两级索引 df_process.columns = pd.MultiIndex.from_tuples( [col.split('_', 1) for col in df_process.columns], names=['quarter', 'metric'] ) # 沿季度维度批量计算所有指标的环比 continuous_pct = df_process.pct_change(axis=1, level='quarter').add_suffix('_PCT_CHG')
3 直接计算Q1到Q3的百分比变化
计算公式为 (q3值 - q1值)/q1值,可以通过以下两种方式实现:
遍历实现
q1_q3_pct = pd.DataFrame() for suffix in metric_suffixes: q1_val = df[f'q1_{suffix}'] q3_val = df[f'q3_{suffix}'] q1_q3_pct[f'q1_to_q3_{suffix}_PCT_CHG'] = (q3_val / q1_val) - 1
多级索引向量化实现
# 基于上面的多级索引df_process直接计算 q1_q3_pct = ( df_process.xs('q3', level='quarter', axis=1) / df_process.xs('q1', level='quarter', axis=1) - 1 ).add_prefix('q1_to_q3_').add_suffix('_PCT_CHG')
内容的提问来源于stack exchange,提问作者Maths12
相关产品推荐
相关产品推荐

