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

如何让Pandas的pct_change按指定Label独立计算行的百分比变化?

按分组独立计算百分比变化(Pandas)

问题场景

现有如下DataFrame:

import pandas as pd

df = pd.DataFrame([
    ['A', 2],
    ['B', 4],
    ['C', 20],
    ['B', 8],
    ['C', 2],
    ['A', 2]],
    columns=['Label', 'Val1',])

print(df)

输出:

Label  Val1
0     A     2
1     B     4
2     C    20
3     B     8
4     C     2
5     A     2

直接使用pct_change()会计算全局的行间变化率:

df['Val1_change'] = df['Val1'].pct_change(periods=1)

得到的结果是与上一行(无论Label是否相同)的对比:

Label  Val1  Val1_change
0     A     2          NaN
1     B     4         1.00
2     C    20         4.00
3     B     8        -0.60
4     C     2        -0.75
5     A     2         0.00

但需求是按相同Label分组,组内独立计算与上一个同Label行的百分比变化,预期结果:

Label  Val1  Val1_change
0     A     2         NaN
1     B     4         NaN
2     C    20         NaN
3     B     8         1.00    # 与上一行B对比增长100%
4     C     2        -0.90    # 与上一行C对比下降90%
5     A     2         0.00    # 与上一行A对比无变化

尝试将Label设为索引后再计算,结果仍不符合需求,因为索引改变不影响行的顺序,pct_change()还是按全局行序计算。


解决方案

使用groupby('Label')对DataFrame按Label分组,再对每组的Val1列应用pct_change(),即可实现组内独立计算:

df['Val1_change'] = df.groupby('Label')['Val1'].pct_change()

执行后查看结果:

print(df)

输出:

Label  Val1  Val1_change
0     A     2          NaN
1     B     4          NaN
2     C    20          NaN
3     B     8          1.0
4     C     2         -0.9
5     A     2          0.0

原理说明

  • groupby('Label')将数据按Label值分成多个子组(A组、B组、C组)
  • 对每个子组的Val1列调用pct_change(),会在组内按行的原始顺序计算与前一行的百分比变化
  • 每个组的第一行没有前序同组数据,因此结果为NaN,完全符合需求

内容的提问来源于stack exchange,提问作者Edy Bourne

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 03:43:29