You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效计算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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 12:24:05