如何获取MultiIndex DataFrame中每个一级分组下的最后一条二级索引行
解法汇总
你要的需求可以通过以下几种更高效的矢量化方法实现,完全不需要用iterrows遍历:
方法1:groupby.tail() (最推荐,写法最简单)
直接按一级索引thread_id分组,取每组的最后1行即可,默认会保留原始的多级索引结构:
import pandas as pd result = df.groupby(level='thread_id').tail(1)
输出结果:
text thread_id message_id_in_thread 0 1 txt1 1 2 txt4 2 1 txt6
方法2:pd.IndexSlice 匹配你想要的类切片写法
如果你偏好类似(:, -1)的索引写法,可以结合分组计数实现,更贴合你描述的语法思路:
idx = pd.IndexSlice # 生成每组最后一行的掩码 last_row_mask = df.groupby(level=0).cumcount() == df.groupby(level=0).cumcount().max(level=0) result = df[last_row_mask]
方法3:groupby.last()
如果不需要严格保留索引的生成逻辑,只是要取每组最后一行的数值,也可以用该方法:
result = df.groupby(level='thread_id').last()
注意:如果你的数据存在空值,
last()会自动取每组最后一个非空值,和tail(1)取最后一行的逻辑有区别,无空值时二者结果一致。
内容的提问来源于stack exchange,提问作者Iván Sánchez
相关产品推荐
相关产品推荐

