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

如何在Pandas DataFrame中识别列值变化位置并保存前一行至新DataFrame

没问题,这在Pandas里有几种非常实用的方法,完美匹配你的需求!我给你拆解两种常见的实现方式,你可以根据具体场景选择:

先还原你的示例数据

首先咱们先把你给出的示例数据转换成可运行的Pandas DataFrame:

import pandas as pd

data = {
    'step_ID': [31, 31, 31, 35, 35],
    'value1': [1, 2, 3, 1, 2],
    'value2': [2, 3, 5, 5, 8],
    'test_step': [2, 2, 2, 2, 2]
}
df = pd.DataFrame(data)

方法一:精准识别step_ID切换的前一行(只取变化点的前置行)

这种方法会找出所有step_ID即将发生变化的行,也就是你要的“变化前的最后一行”,而且不会包含整个DataFrame的最后一行(如果你不需要的话):

# 标记当前行的step_ID和下一行是否不同,同时排除最后一行(因为下一行不存在)
mask = (df['step_ID'] != df['step_ID'].shift(-1)) & df['step_ID'].shift(-1).notna()

# 筛选出符合条件的行,生成新DataFrame
last_rows_df = df[mask].copy()

运行后last_rows_df就会只保留step_ID=31的最后一行,完全符合你的需求。

方法二:获取每个唯一step_ID的最后一行(适合需要所有组的情况)

如果你之后可能需要所有不同step_ID的最后一行,不管有没有发生切换,可以用groupby配合tail(1),一步到位:

# 按step_ID分组,取每个组的最后一行
last_rows_df = df.groupby('step_ID').tail(1).copy()

这个方法会同时得到step_ID=31和35的最后一行,适合需要完整组尾数据的场景。

额外小技巧:一行代码搞定(省略临时标记)

如果你不想生成中间标记列,可以把筛选逻辑合并成一行:

last_rows_df = df.loc[df['step_ID'].ne(df['step_ID'].shift(-1)) & df['step_ID'].shift(-1).notna()]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 07:18:10