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
相关产品推荐
相关产品推荐

