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

Pandas按id分组取上一行列值计算新增百分比列实现方法

pandas分组内关联上一行数据的计算实现

测试数据构造

先构造题目给出的示例DataFrame:

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randint(0,30,size=10),
                 columns=["Random"],
                 index=pd.date_range("20180101", periods=10))
df=df.reset_index()
df.loc[:,'Random'] = [31,11,21,23,43,42,51,47,49,22]
df['id']=[1,1,1,2,2,2,3,3,3,3]
df['diff']=[3,2,4,1,6,1,2,2,3,1]

计算规则

  • 按id字段做分组聚合
  • 新增Percentage列,计算逻辑为:当前行的diff列值 / 同组内上一行的Random列值 * 100
  • 每个id分组的首行没有对应的上一行Random值,Percentage列填充NaN
  • 示例校验:id=1分组第二行的Percentage值应为(2/31)*100 ≈ 6.45

实现代码

pandas的groupby对象原生支持shift()方法,位移操作仅在单个分组内部生效,和全局场景下shift的使用逻辑完全一致,不需要额外写循环或自定义函数:

df['Percentage'] = df['diff'] / df.groupby('id')['Random'].shift(1) * 100

结果校验

执行代码后输出的DataFrame如下,完全符合计算规则:

index  Random  id  diff  Percentage
0 2018-01-01      31   1     3         NaN
1 2018-01-02      11   1     2    6.451613
2 2018-01-03      21   1     4   36.363636
3 2018-01-04      23   2     1         NaN
4 2018-01-05      43   2     6   26.086957
5 2018-01-06      42   2     1    2.325581
6 2018-01-07      51   3     2         NaN
7 2018-01-08      47   3     2    3.921569
8 2018-01-09      49   3     3    6.382979
9 2018-01-10      22   3     1    2.040816

其中第二行计算值和示例给出的(2/31)*100完全匹配,每个分组首行均为NaN。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 09:36:23