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

如何在Pandas DataFrame中新增iteration列:差值<0时迭代值+1

为DataFrame添加基于前后行差值的迭代序号列

问题描述

现有包含目标列的DataFrame:

import pandas as pd
data = pd.DataFrame([0.0, 0.1, 0.2, 0.3, 1.5, 2.7, 3.8, 0.0, 0.3, 0.8, 1.2, 2.5, 3.5, 0.0, 0.5, 1.0, 3.0, 0.0, 1.5, 2.6, 3.6, 4.0], columns=['value'])

需要新增一列iteration,规则为:每当后一行数值与前一行的差值小于0时,迭代值加1,初始迭代值为1,最终期望的iteration列如下:

[1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4]

解决方案

可以利用pandas的diff()和cumsum()方法快速实现,核心逻辑是标记需要迭代加1的位置,再累加生成序号:

简化版代码(一行实现)

data['iteration'] = (data['value'].diff() < 0).cumsum() + 1

分步解释版代码(便于理解)

# 1. 计算后一行与前一行的差值(后行 - 前行),第一行无前置行,结果为NaN
data['diff'] = data['value'].diff()

# 2. 标记差值小于0的位置:后行比前行小时标记为1,否则为0
data['flag'] = (data['diff'] < 0).astype(int)

# 3. 累加标记值并加1,得到迭代序号(初始值从1开始)
data['iteration'] = data['flag'].cumsum() + 1

# 4. 按需删除中间辅助列
data = data.drop(['diff', 'flag'], axis=1)

原理说明

  • diff():计算当前行与前一行的数值差,自动处理第一行的缺失值(NaN)
  • (diff < 0):生成布尔序列,标记所有需要触发迭代加1的位置
  • cumsum():累加标记值,每遇到一个标记点,累加值就加1,形成基础序号
  • +1:将基础序号(从0开始)偏移为从1开始的迭代值

验证结果

执行代码后,data['iteration']将完全匹配期望的序列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 23:55:24