基于ID观测数过滤DataFrame:删除对应最小年份行
解决方法:按ID过滤并删除年份最小的行
针对你提出的需求,我整理了一个简洁的Pandas实现方案,完全贴合你的示例要求:
首先,先还原你的原始DataFrame:
import pandas as pd # 创建原始数据 df = pd.DataFrame({ 'year': [2019, 2012, 2017, 2013, 2018, 2012, 2013], 'id': ['x1', 'x1', 'x1', 'x1', 'x2', 'x2', 'x2'] })
接下来是核心处理代码,直接实现“ID行数超3则删除年份最小行”的逻辑:
# 按ID分组,对每组按年份降序排序后取前3行(自动过滤掉年份最小的多余行) processed_df = df.groupby('id', group_keys=False).apply( lambda group: group.sort_values('year', ascending=False).head(3) ).reset_index(drop=True)
代码逻辑解释:
- 分组:用
groupby('id')把数据按ID拆分,group_keys=False避免分组键干扰最终结果的结构; - 排序+筛选:对每个ID组,先按
year降序排列(年份大的在前),然后用head(3)取前3行——如果组内行数≤3,就保留全部;如果行数>3,就自动剔除年份最小的那些行(因为降序后它们排在末尾); - 重置索引:
reset_index(drop=True)把结果的索引重置为连续的数字,和你给出的示例格式一致。
运行后得到的结果完全符合预期:
year id 0 2019 x1 1 2017 x1 2 2013 x1 3 2018 x2 4 2012 x2 5 2013 x2
内容的提问来源于stack exchange,提问作者yljavd
相关产品推荐
相关产品推荐

