如何筛选Pandas多级索引DataFrame中各年份对应的最大月份数据
解决多级索引DataFrame按年取最大月份数据的问题
针对你这个已排序的多级索引(Year, Month)DataFrame,要自动获取每个年份对应的最大月份(也就是每个年份的最后一条记录)数据,有几个简洁且非硬编码的方法,下面一一说明:
方法1:利用groupby + tail(1)(最简洁,适配已排序索引)
因为你的索引已经按Year和Month完成排序,每个年份的最后一条记录就是对应最大月份的数据,直接按Year分组后取每组的最后一行即可:
result = df.groupby(level='Year').tail(1)
这个方法效率很高,tail(1)会直接定位到每个分组的最后一条数据,完全不需要手动指定月份值。
方法2:利用groupby + idxmax(通用型,适配未排序索引)
如果你的索引没有提前排序,或者想明确获取每个年份中Month最大的那条数据,可以先通过idxmax找到每个年份对应最大Month的索引,再用loc选取:
# 获取每个年份下Month最大的行索引 max_month_indices = df.groupby(level='Year')['Month'].idxmax() # 根据索引筛选数据 result = df.loc[max_month_indices]
这个方法不受索引排序状态影响,适用性更广。
为什么iloc直接用会报错?
你尝试的df.iloc[(slice(None), -1),:]报错是因为iloc是基于位置的一维索引,无法直接对应多级索引的层级结构。如果一定要用iloc,可以结合groupby和apply来逐组处理:
result = df.groupby(level='Year').apply(lambda group: group.iloc[-1])
不过这种方法的效率不如前两种,因为apply会逐组执行lambda函数,数据量大时会稍慢。
内容的提问来源于stack exchange,提问作者Henrique Branco
相关产品推荐
相关产品推荐

