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
详情:
最外层索引级别,级别=0unstack
- 使用,
选择数据帧中的最后三条记录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