如何在多索引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
相关产品推荐
相关产品推荐

