Python 用整数高效切片非整数多级索引

Python 用整数高效切片非整数多级索引,python,pandas,dataframe,Python,Pandas,Dataframe,下面的代码生成一个带有多级索引的示例数据帧。第一级是字符串,第二级是日期时间 剧本 输出 对于第一级中的每个项目,我想选择第二级中的最后三条记录。问题是我不知道datetime值,因此我需要选择基于整数的索引位置。为了实现以下目标,对数据帧进行切片的最有效方法是什么 期望输出 我的尝试 返回完整的数据帧: df_sel = df.iloc[:,-3:] 引发错误,因为loc不支持在datetime对象上使用整数值: df_sel = df.loc[:,-3:] 返回第二级中的最后三个条目,但

下面的代码生成一个带有多级索引的示例数据帧。第一级是
字符串
,第二级是
日期时间

剧本 输出 对于第一级中的每个项目,我想选择第二级中的最后三条记录。问题是我不知道
datetime
值,因此我需要选择基于整数的索引位置。为了实现以下目标,对数据帧进行切片的最有效方法是什么

期望输出 我的尝试 返回完整的数据帧:

df_sel = df.iloc[:,-3:]
引发错误,因为
loc
不支持在
datetime
对象上使用整数值:

df_sel = df.loc[:,-3:]
返回第二级中的最后三个条目,但仅返回第一级中的最后一个条目:

df_sel = df.loc[:].iloc[-3:]

我有两种方法来解决这个问题:

方法1: 正如Quang Hoang的第一条评论所提到的,您可以使用groupby来实现这一点,我认为它的代码最短:

df.groupby(level=0).tail(3)
方法2: 您还可以在网络中对每个节点进行切片,然后对其进行连接:

pd.concat([df.loc[[i]][-3:] for i in networks])
这两种方法都将输出您想要的结果:

另一种方法是进行重塑:

df.unstack(0).iloc[-3:].stack().swaplevel(0,1).sort_index()
输出:

                            active_clients throughput  speed
network time                                                
ALPHA   2021-01-01 08:00:00             26       4081  11325
        2021-01-01 10:00:00             13       3370  10716
        2021-01-01 12:00:00             13       3691  10737
BETA    2021-01-01 08:00:00             28       2105  10465
        2021-01-01 10:00:00             21       2444  10158
        2021-01-01 12:00:00             24       1947  11226
GAMMA   2021-01-01 08:00:00             13       1850  10288
        2021-01-01 10:00:00             23       2241  11521
        2021-01-01 12:00:00             30       3515  11138
详情:

  • unstack
    最外层索引级别,级别=0
  • 使用,
    iloc
    选择数据帧中的最后三条记录
  • stack
    将该级别返回到索引
    swaplevel
    sort\u索引

    • df.groupby(level=0)。tail(3)
      ?嗯,我不知道你把level传递给groupby。谢谢Quang,我不知道tail接受了任何参数。
      pd.concat([df.loc[[i]][-3:] for i in networks])
      
      df.unstack(0).iloc[-3:].stack().swaplevel(0,1).sort_index()
      
                                  active_clients throughput  speed
      network time                                                
      ALPHA   2021-01-01 08:00:00             26       4081  11325
              2021-01-01 10:00:00             13       3370  10716
              2021-01-01 12:00:00             13       3691  10737
      BETA    2021-01-01 08:00:00             28       2105  10465
              2021-01-01 10:00:00             21       2444  10158
              2021-01-01 12:00:00             24       1947  11226
      GAMMA   2021-01-01 08:00:00             13       1850  10288
              2021-01-01 10:00:00             23       2241  11521
              2021-01-01 12:00:00             30       3515  11138