在多级索引的一个级别上过滤pandas数据帧

Ale*_*lex 9 python pandas

如果我有一个带有多级索引的pandas数据帧,我该如何按该索引的某个级别进行过滤.例如:

df = pd.DataFrame({"id": [1,2,1,2], "time": [1, 1, 2, 2], "val": [1,2,3,4]})
df.set_index(keys=["id", "time"], inplace=True)
Run Code Online (Sandbox Code Playgroud)

我想做的事情如下:

df[df["time"] > 1]
Run Code Online (Sandbox Code Playgroud)

time不再是专栏.我可以将它保留为列,但我不想拖动数据副本.

Max*_*axU 8

In [17]: df[df.index.get_level_values('time') > 1]
Out[17]:
         val
id time
1  2       3
2  2       4
Run Code Online (Sandbox Code Playgroud)

@ piRSquared的解决方案虽然更具惯用性......


piR*_*red 7

query

df.query('time > 1')

         val
id time     
1  2       3
2  2       4
Run Code Online (Sandbox Code Playgroud)

IndexSlice

DataFrame索引必须是lexsorted

df.sort_index().loc[pd.IndexSlice[:, 2:], :]

         val
id time     
1  2       3
2  2       4
Run Code Online (Sandbox Code Playgroud)

  • @Alex Note; `level ='time',df.query("@ level> 1")`适用于变量. (3认同)