如何在三级索引Multi Index DataFrame中保留每月最后一天数据
保留Multi Index DataFrame中每月最后一天的数据
针对带有年、月、日三级索引的Multi Index DataFrame,要保留每个月最后一天的数据,这里提供两种实用方法:
方法一:直接基于三级索引分组筛选
如果你的日索引是每个月的实际日期值(比如示例中2024年4月的最大日是4),可以通过按年、月分组,筛选出每组中日最大的记录:
import pandas as pd # 假设你的DataFrame名为df,索引是['年', '月', '日']的MultiIndex # 第一步:按年、月分组,获取每个组的最大日值 max_day_per_month = df.groupby(level=['年', '月']).apply(lambda x: x.index.get_level_values('日').max()) # 第二步:构造符合MultiIndex的索引元组,提取对应数据 selected_indices = [(year, month, day) for (year, month), day in max_day_per_month.items()] result = df.loc[selected_indices]
方法二:转换为日期列处理
如果担心日期逻辑有歧义,可以先把三级索引转为日期列,再按月份筛选最后一天:
# 重置索引为普通列 df_reset = df.reset_index() # 拼接年、月、日为datetime类型列 df_reset['full_date'] = pd.to_datetime(df_reset[['年', '月', '日']]) # 按年和月分组,取每组中日期最晚的一行 result_reset = df_reset.groupby([df_reset['full_date'].dt.year, df_reset['full_date'].dt.month]).tail(1) # 恢复原三级索引 result = result_reset.set_index(['年', '月', '日'])
补充说明
如果你的日索引是按时间顺序排序的(每个月的最后一行就是当月最后一天),可以用更简洁的写法:
result = df.groupby(level=['年', '月']).tail(1)
内容的提问来源于stack exchange,提问作者Crovish
相关产品推荐
相关产品推荐

