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

使用Pandas Groupby计算组内首尾值差并填充至所有行

这事儿用Pandas的分组操作就能轻松搞定,我给你两种实用的实现方式,都能精准达到你想要的效果:

首先先还原你的原始数据(方便直接测试):

import pandas as pd

df = pd.DataFrame({
    'GRP_ID': [9273346,9273346,9273346,9273346,9273347,9273347,9273347,9273347,9273347,9273347,9273347,9273348,9273348,9273348,9273348,9273348,9273350],
    'Value': [51,74,40,22,405,405,405,405,405,405,405,26,84,74,25,49,4522]
})

方法1:用groupby.transform直接广播计算结果

这是最简洁的方式,transform会自动把每个组的计算结果填充到组内的每一行:

df['Result'] = df.groupby('GRP_ID')['Value'].transform(lambda x: x.iloc[-1] - x.iloc[0])

原理很简单:对每个GRP_ID组,取Value列的最后一个值减去第一个值,transform会把这个差值广播到组内所有行。对于只有一行的组(比如9273350),首尾值相同,差值自然为0,完全符合你的需求。

方法2:先计算组级差值,再合并回原表

如果觉得自定义lambda不够直观,也可以先单独算出每个组的差值,再通过GRP_ID关联回原表:

# 先计算每个组的首尾差值,生成临时表
group_diff = df.groupby('GRP_ID')['Value'].agg(lambda x: x.iloc[-1] - x.iloc[0]).reset_index(name='Result')
# 合并回原DataFrame
df = df.merge(group_diff, on='GRP_ID', how='left')

两种方法运行后,你都会得到想要的结果:

GRP_ID  Value  Result
0    9273346     51     -29
1    9273346     74     -29
2    9273346     40     -29
3    9273346     22     -29
4    9273347    405       0
5    9273347    405       0
6    9273347    405       0
7    9273347    405       0
8    9273347    405       0
9    9273347    405       0
10   9273347    405       0
11   9273348     26      23
12   9273348     84      23
13   9273348     74      23
14   9273348     25      23
15   9273348     49      23
16   9273350   4522       0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 14:52:31