如何筛选多索引DataFrame:保留每组ind的最新日期行
解决DataFrame保留每个分组最新日期行的问题
嘿,这个需求在日常数据处理里太常见了,我给你分享几个实用的解决方案,既能用groupby实现类似SQL的GROUP BY + HAVING逻辑,还有更简洁的方法:
方法1:groupby + idxmax(最贴近SQL逻辑)
既然你的date已经是datetime格式,我们可以按ind分组后,找到每个组中date最大的行的索引,再用loc提取这些行,完美对应SQL里GROUP BY ind HAVING date = MAX(date)的逻辑:
# 如果还没转datetime格式,先转(你说已经转好的话可以跳过这步) df['date'] = pd.to_datetime(df['date'], format='%d-%m-%Y') # 核心代码:分组找最新日期行的索引,再筛选 result = df.loc[df.groupby('ind')['date'].idxmax()]
这个方法的优势是效率很高,尤其是大数据集下,因为不需要对全量数据排序,只需要分组计算最大值索引。
方法2:排序去重(代码更简洁直观)
如果你觉得上面的方法有点绕,也可以先按ind分组、date降序排序,然后保留每个ind的第一行(也就是最新日期的行):
# 先按ind升序、date降序排序,然后删除重复的ind,保留第一行 result = df.sort_values(['ind', 'date'], ascending=[True, False]).drop_duplicates('ind')
这个方法代码更易读,理解成本低,小数据量下用起来非常顺手。
针对ind和date是索引的情况
如果你的DataFrame是用ind和date做MultiIndex的,只需要先重置索引处理,最后再还原回去就行:
# 重置索引为普通列 df_reset = df.reset_index() # 用方法1或方法2处理 result = df_reset.loc[df_reset.groupby('ind')['date'].idxmax()] # 还原回原索引 result = result.set_index(['ind', 'date'])
总结
- 追求效率选
groupby + idxmax,大数据集表现更好 - 追求代码简洁选
sort_values + drop_duplicates,易读性拉满 - 两种方法都能完美实现你要的“保留每个ind最新日期行”的需求,根据自己的场景选就行~
内容的提问来源于stack exchange,提问作者Rob
相关产品推荐
相关产品推荐

