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

