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

Pandas:基于另一列条件计算动态差值

问题描述

需要基于Condition列的二元条件,计算Values列的动态差值:

  • 当Condition为0时,计算当前行与前一行的差值
  • 当Condition为1时,计算当前行与上一个Condition为1的行的差值

示例数据:

Values    Condition   Desired_Output
0   5000            1              NaN
1   5500            0            500.0
2   6700            1           1700.0
3   7100            0            400.0
4   8500            0           1400.0
5   9000            0            500.0
6   10500           1           3800.0
7   15750           0           5250.0
8   18000           1           7500.0
9   22250           0           4250.0
10  26000           0           3750.0
11  29750           0           3750.0
12  33500           0           3750.0
13  37250           0           3750.0
14  41000           1          23000.0
15  44750           0           3750.0
16  48500           1           7500.0
17  52250           1           3750.0
18  56000           0           3750.0
19  59750           1           7500.0
20  63500           0           3750.0
21  67250           0           3750.0
22  71000           0           3750.0
23  74750           0           3750.0
24  78500           0           3750.0
25  82250           1          22500.0
26  86000           0           3750.0
27  89750           1           7500.0

此前尝试使用groupby未达到预期效果:

df.insert(2, 'Difference', (df.groupby('Condition')['Values'].diff()))

希望找到无需多列处理的简洁实现方式。

解决方案

方法1:结合ffill与条件判断

核心逻辑是先提取所有Condition=1的行的Values,通过ffill()将值向后填充,让每行都能获取到上一个Condition=1的Values,再按条件计算差值:

# 生成上一个Condition=1的Values序列,初始位置用NaN填充
prev_1_values = df['Values'].where(df['Condition'] == 1).ffill()

# 按条件计算差值
df['Difference'] = df.apply(
    lambda row: row['Values'] - row['Values'].shift(1) if row['Condition'] == 0 
    else row['Values'] - prev_1_values.shift(1),
    axis=1
)

方法2:用numpy.where实现高效计算

若想避免apply的循环开销,可使用numpy.where结合移位操作:

import numpy as np

# 前一行的Values
prev_row_values = df['Values'].shift(1)
# 上一个Condition=1的Values(填充后),移位后对应当前Condition=1行的对比值
prev_1_values = df['Values'].where(df['Condition'] == 1).ffill().shift(1)

# 条件分支计算差值
df['Difference'] = np.where(
    df['Condition'] == 0,
    df['Values'] - prev_row_values,
    df['Values'] - prev_1_values
)

问题原因说明

之前的groupby方法逻辑错误:groupby('Condition')['Values'].diff()会将Condition=0和Condition=1分为两组分别计算组内差值,但需求中Condition=0的行需要和**前一行(无论Condition值)**对比,而非组内的前一个0值行,因此无法得到正确结果。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 22:40:29