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

Python Pandas:获取Level发生变化的最新记录

获取每个ID最后一次Level变化的记录

问题背景

给定包含ID、Month、Level、Grade、Flag_Level字段的DataFrame:

  • ID是唯一标识,每个ID对应多条月度记录
  • Level/Grade表示当月等级
  • Flag_Level标记当月是否发生Level变化(Y=有变化,N=无变化)

此前尝试用groupby+shift筛选,但输出了所有Level变化的记录,现在需要提取每个ID下最后一次Level变化的记录(例如ID1取2021-04-01的记录,ID2取2020-03-01的记录,ID3取2021-02-01的记录)。

解决方案

方法1:基于已有Flag_Level字段

先确保数据按ID和Month升序排序(保证最新记录在每组末尾),再筛选出有变化的记录,最后按ID分组取每组最后一条:

# 按ID和时间排序
df = df.sort_values(['ID', 'Month'])

# 筛选所有Level变化的记录,再按ID取最新的一条
result = df[df['Flag_Level'] == 'Y'].groupby('ID').last().reset_index()

方法2:自行计算Level变化(更可靠)

如果Flag_Level字段可能存在不准确的情况,可以自己计算Level是否和上月发生变化,再提取最新记录:

# 先按ID和时间排序
df = df.sort_values(['ID', 'Month'])

# 计算每个ID的当月Level是否与上月不同
df['Level_Changed'] = df.groupby('ID')['Level'].apply(lambda x: x != x.shift())

# 筛选变化记录,按ID取最新的一条
result = df[df['Level_Changed']].groupby('ID').last().reset_index()

关键说明

  • 排序是核心前提:只有先按Month排序,groupby('ID').last()才能拿到每个ID时间最新的变化记录
  • 方法2不依赖原有标记字段,适用于Flag_Level可能遗漏或错误的场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 07:09:39