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

