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

