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

