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

如何在Pandas中按B分组计算不同block间C列的差值?

按分组计算不同block的C列差值

原始数据

定义的DataFrame如下:

import pandas as pd

df = pd.DataFrame({'block': [1, 1, 1, 2, 2, 2, 3, 3, 3],
                   'B': ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c'],
                   'C': [1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000],
                   })

输出的原始表格:

block  B     C
0     1  a  1000
1     1  b  2000
2     1  c  3000
3     2  a  4000
4     2  b  5000
5     2  c  6000
6     3  a  7000
7     3  b  8000
8     3  c  9000

需求

生成diff_column,按B列分组后,计算当前block对应C值与前一个block对应C值的差值。例如block2中a的C值4000减去block1中a的C值1000,结果为3000;block1的行无前置block,差值留空。

错误尝试

用户尝试的代码无法得到正确结果:

df['diff_column'] = df.groupby(['block', 'B'])['C'] - df.shift[-1].groupby(['block', 'B'])['C']

正确解法

核心思路是仅按B列分组,因为同一B值的行按block顺序排列,使用diff()方法即可计算当前行与前一行的差值:

df['diff_column'] = df.groupby('B')['C'].diff()

执行后得到的结果:

block  B     C  diff_column
0     1  a  1000          NaN
1     1  b  2000          NaN
2     1  c  3000          NaN
3     2  a  4000       3000.0
4     2  b  5000       3000.0
5     2  c  6000       3000.0
6     3  a  7000       3000.0
7     3  b  8000       3000.0
8     3  c  9000       3000.0

说明

之前的错误在于同时按block和B分组,每个分组仅包含一行数据,无法计算差值。而仅按B分组后,每组内的行按block顺序排列,diff()方法会自动处理前一行的取值,block1的行因无前置行,自然得到NaN,完全符合需求。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 05:50:34