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

如何为DataFrame分组排序后添加列计算B列与后续值的差值?

当然可以!几行代码就能搞定需求

咱们直接上完整实现,然后拆解逻辑:

完整代码

import pandas as pd
import numpy as np
np.random.seed(0)
df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar','foo', 'bar', 'foo', 'foo'], 'B' : np.random.randint(0,100,8)})

# 核心逻辑:分组→组内排序→计算相邻差值
df['C'] = df.groupby('A').apply(
    lambda group: group.sort_values('B').assign(C=lambda g: g['B'].shift(-1) - g['B'])['C']
).reset_index(level=0, drop=True)

# 查看结果
print(df)

代码逻辑拆解

我把核心步骤拆解开,方便你理解:

  • 按A列分组:用groupby('A')把DataFrame分成foo和bar两个独立的分组
  • 组内按B排序:在每个分组里用sort_values('B')对B列升序排列(如果要降序可以加ascending=False)
  • 计算相邻差值:用shift(-1)把B列的值向下位移一位(获取下一行的B值),再减去当前行的B值,得到差值并临时存入C列
  • 对齐索引:最后用reset_index(level=0, drop=True)去掉分组带来的额外索引,让计算出的C列值能完美匹配原DataFrame的行

运行结果

因为设置了np.random.seed(0),你会得到固定的输出:

A   B     C
0  foo  44  21.0
1  bar  47  17.0
2  foo  65  16.0
3  bar  64  12.0
4  foo  67  23.0
5  bar  76   NaN
6  foo  90   NaN
7  foo  83   7.0

注意每组的最后一行C值是NaN,这是因为没有下一个元素可以计算差值,属于正常现象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:43:16