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

如何在Pandas DataFrame中结合条件逻辑计算行差值

带条件的DataFrame行差值计算

需求说明

使用pandas.DataFrame.diff()计算DataFrame中相邻行的差值,当data列的值为0时,将该行的差值设为0(也可设为NaN)。

示例代码

import pandas as pd
# Sample DataFrame
df = pd.DataFrame({'data': [10, 20, 0, 25, 0, 0, 30, 25, 40]})
df['diff'] = df.data.diff()

结果对比

valuediffdesired_result
10NaNNaN
201010
0-200
252525
0-250
000
303030
25-5-5
401515

无效尝试代码

df['diff'] = df['data'].apply(lambda x: 0 if x == 0 else df.data.diff())

解决方案

方法1:使用numpy.where

先计算基础差值,再通过条件判断修改目标位置的值:

import pandas as pd
import numpy as np

df = pd.DataFrame({'data': [10, 20, 0, 25, 0, 0, 30, 25, 40]})
df['diff'] = df['data'].diff()
# 当data列为0时,将diff设为0
df['diff'] = np.where(df['data'] == 0, 0, df['diff'])

方法2:使用Series.mask

直接对差值序列进行条件替换,代码更简洁:

import pandas as pd

df = pd.DataFrame({'data': [10, 20, 0, 25, 0, 0, 30, 25, 40]})
df['diff'] = df['data'].diff().mask(df['data'] == 0, 0)

若需将目标位置设为NaN

只需把替换值改成np.nan即可:

# 使用numpy.where
df['diff'] = np.where(df['data'] == 0, np.nan, df['diff'])

# 使用mask(mask默认替换为NaN,可省略第二个参数)
df['diff'] = df['data'].diff().mask(df['data'] == 0)

无效代码原因说明

之前的apply写法错误在于:lambda中的x是data列的单个元素,而df.data.diff()返回的是整个差值Series,这会导致每个符合条件的元素都被替换成整个Series,最终结果不符合预期。正确思路是先生成完整的差值序列,再针对data列的条件修改对应位置的值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 23:22:36