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

带缺失值的DataFrame按id分组实现行前后差分的技术咨询

嘿,这个需求用Pandas的分组、填充加移位操作就能轻松搞定,我给你一步步拆解实现方法:

解决方案

要按id分组计算当前行和最近非缺失的上一行/下一行的差值,核心思路是利用前向/后向填充找到最近的非缺失值,再结合移位操作对齐到当前行,最后计算差值。

具体步骤&代码示例

首先先构造一个示例数据方便演示(你可以替换成自己的DataFrame):

import pandas as pd

data = {
    'id': [1,1,1,1,1,2,2,2,2],
    'value': [10, None, 15, None, 20, 5, None, None, 15]
}
df = pd.DataFrame(data)
1. 计算向后差分(当前行 - 最近非缺失上一行)

我们需要先给每个id组内的缺失值做前向填充(ffill),这样就能得到每个位置前面最近的非缺失值;再把填充后的结果向下移一行,就对齐到了当前行的“最近非缺失上一行”;最后用当前行的原始值减去这个值就行:

df['diff_backward'] = df.groupby('id')['value'].apply(
    lambda x: x - x.ffill().shift(1)
)
2. 计算向前差分(当前行 - 最近非缺失下一行)

类似的,这次用后向填充(bfill)找到每个位置后面最近的非缺失值,再把填充后的结果向上移一行对齐到当前行,最后计算差值:

df['diff_forward'] = df.groupby('id')['value'].apply(
    lambda x: x - x.bfill().shift(-1)
)

运行结果

执行完上面的代码后,你会得到这样的结果:

id  value  diff_backward  diff_forward
0   1   10.0            NaN          -5.0
1   1    NaN            NaN           NaN
2   1   15.0            5.0          -5.0
3   1    NaN            NaN           NaN
4   1   20.0            5.0           NaN
5   2    5.0            NaN         -10.0
6   2    NaN            NaN           NaN
7   2    NaN            NaN           NaN
8   2   15.0           10.0           NaN

几个关键细节

  • 如果当前行本身是NA,那对应的差分结果也会是NA(毕竟缺失值没法计算差值嘛);
  • 每个id组的第一行没有上一行,所以diff_backward是NA;最后一行没有下一行,所以diff_forward是NA;
  • 这种方法用的是Pandas的向量化操作,比手动遍历每行高效太多,大数据集也能轻松处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:31:27