如何在Pandas MultiIndex数据框中使用负索引获取末尾n行?
如何在MultiIndex Pandas DataFrame中通过负索引获取最后n行?
首先咱们得搞明白为什么直接用df[-2:]或者df.loc[-2:]行不通:
- 当DataFrame是MultiIndex结构时,
df[]和df.loc[]默认是按标签索引的,而你的行标签是元组(比如(0, 'p')、(3, 'r')),不是单个整数,所以-2:这种整数范围根本匹配不到对应的标签,自然无法生效。 - 只有当DataFrame用默认的整数位置索引时,
df[-2:]这种写法才会起作用。
接下来给你两种简单好用的解决方案:
方法1:使用iloc(最推荐,直接高效)
iloc是基于整数位置来索引的,完全不依赖你的索引标签是什么,不管是不是MultiIndex,都可以用负位置来取最后n行:
# 获取最后2行数据 df.iloc[-2:]
对应你的示例数据,运行结果会是:
A B C time features 4 q 0.726294 0.401679 0.023117 r 0.391882 0.700574 0.280084
如果要取最后3行,直接改成df.iloc[-3:]就行,以此类推。
方法2:结合索引标签使用loc
如果你一定要用loc,可以先获取最后n行的索引标签,再传入loc进行定位:
# 先拿到最后2行的索引标签,再用loc匹配 df.loc[df.index[-2:]]
这个方法的逻辑是:df.index会返回所有行的MultiIndex标签(是一个元组数组),df.index[-2:]能精准拿到最后2行的标签,再用loc根据这些标签匹配行,结果和iloc完全一致。
补充:如果想按time层级取最后n组数据
要是你的需求不是取最后n行,而是取最后n个time分组(比如最后2个time值:3和4对应的所有行),可以这么写:
# 先提取time的唯一值,取最后2个 last_n_times = df.index.get_level_values('time').unique()[-2:] # 匹配这些time对应的所有行 df.loc[last_n_times, :]
这样就能拿到time=3和4对应的全部6行数据。
内容的提问来源于stack exchange,提问作者Jayendra Parmar
相关产品推荐
相关产品推荐

