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

如何在多索引DataFrame中选取各主索引的最后一个次索引?

解决多索引DataFrame选取每个主索引对应最后一个次索引的问题

我来帮你搞定这个需求!针对多索引DataFrame里每个主索引(这里是THill)提取对应最后一个次索引(Ply)的行,有几种简洁高效的方法,我结合你的示例一步步演示:

先明确示例DataFrame结构

首先把你给出的示例数据构造成标准的多索引DataFrame,方便后续操作:

import pandas as pd

# 构造数据
data = {'Elm': [0.22865, 0.22847, 0.33411, 0.33370, 0.22919, 0.22907, 0.33480, 0.33436, 0.22828, 0.22801]}
# 构造多索引:主索引THill,次索引Ply
multi_index = pd.MultiIndex.from_tuples(
    [(100000, 1), (100000, 2), (100000, 3), (100000, 4),
     (100001, 1), (100001, 2), (100001, 3), (100001, 4), (100001, 5), (100001, 6)],
    names=['THill', 'Ply']
)
df = pd.DataFrame(data, index=multi_index)

方法1:最直观的groupby + tail(1)

这是最推荐的方法,逻辑简单且高效:按主索引分组,直接取每组的最后一行,正好对应每个THill的最后一个Ply记录:

result = df.groupby(level='THill').tail(1)

执行后得到的结果就是你想要的:

Elm
THill   Ply       
100000  4   0.33370
100001  6   0.22801

方法2:基于次索引最大值筛选

如果你需要明确基于Ply的最大值来选取(比如索引未排序的情况),可以先找到每个THill对应的最大Ply值,再用loc提取:

# 计算每个THill对应的最大Ply值
max_ply = df.groupby(level='THill').apply(lambda x: x.index.get_level_values('Ply').max())
# 构造索引元组列表,用loc选取对应行
result = df.loc[list(max_ply.items())]

方法3:drop_duplicates(适合已排序的场景)

如果你的DataFrame已经按THill和Ply升序排列,也可以用去重的方式保留每个主索引的最后一条记录:

# 重置索引→去重→还原索引
result = df.reset_index().drop_duplicates(subset='THill', keep='last').set_index(['THill', 'Ply'])

不过这种方法需要来回转换索引,效率不如前两种,适合小数据量场景。

注意事项

如果你的次索引Ply不是按顺序排列的,建议先对索引排序再用groupby.tail(1),避免取到的不是最大Ply的行:

result = df.sort_index().groupby(level='THill').tail(1)

内容的提问来源于stack exchange,提问作者screenpaver

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:05:01