You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在三级索引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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 12:52:33