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

