按位置切片 MultiIndex pandas DataFrame

Zak*_*Zak 5 python multi-index pandas

我目前正在尝试按位置对具有三个级别的 MuliIndex DataFrame 进行切片。我正在使用熊猫 19.1

Level0  Level1  Level2      Value
03-00368    A   Item111     6.9
03-00368    A   Item333     19.2
03-00368    B   Item111     9.7
03-00368    B   Item222     17.4
04-00176    C   Item110     17.4
04-00176    C   Item111     9.7
04-00246    D   Item46      12.5
04-00246    D   Item66      5.6
04-00246    D   Item99      11.2
04-00247    E   Item23      12.5
04-00247    E   Item24      5.6
04-00247    E   Item111     11.2
04-00247    F   Item23      7.9
04-00247    F   Item24      9.7
04-00247    F   Item111     12.5
04-00247    G   Item46      11.2
04-00247    G   Item66      9.7
04-00247    G   Item999     9.7
04-00247    H   Item23      11.2
04-00247    H   Item94      7.9
04-00247    H   Item111     11.2
04-00247    I   Item46      5.6
04-00247    I   Item66      12.5
04-00247    I   Item888     11.2
04-00353    J   Item66      12.5
04-00353    J   Item99      12.5
04-00354    K   Item43      12.5
04-00354    K   Item94      12.5
04-00355    L   Item54      50
04-00355    L   Item99      50
Run Code Online (Sandbox Code Playgroud)

目前我可以实现:

df.loc[(slice('03-00368', '04-00361'), slice(None), slice(None)), :]
Run Code Online (Sandbox Code Playgroud)

但实际上我不知道标签是什么。我只想选择前十个 0 级,所以我尝试了这个(以及许多其他类似的东西):

>>> df.iloc[(slice(0, 10), slice(None), slice(None)), :]
TypeError: unorderable types: int() >= NoneType()
Run Code Online (Sandbox Code Playgroud)

最终目标是限制显示的最终行数,而不破坏 Level0 索引

>>>df.iloc[(0,1,), :]
Level0   Level1 Level2      Value
03-00368    A   Item111     6.9
03-00368    A   Item333     19.2
Run Code Online (Sandbox Code Playgroud)

请注意,它只返回前两行,我希望结果是:

Level0  Level1  Level2      Value
03-00368    A   Item111     6.9
03-00368    A   Item333     19.2
03-00368    B   Item111     9.7
03-00368    B   Item222     17.4
04-00176    C   Item110     17.4
04-00176    C   Item111     9.7
Run Code Online (Sandbox Code Playgroud)

有一些hacky 方法可以实现这一点,但我发帖是因为我想知道我做错了什么,或者为什么我不能期望能够以这种方式对 MultiIndex 进行切片。

piR*_*red 6

方法一
groupby+head

df.groupby(level=0).head(10)
Run Code Online (Sandbox Code Playgroud)

方法 2
不必要的冗长
IndexSlice

df.sort_index().loc[pd.IndexSlice[df.index.levels[0][:10], :, :], :]
Run Code Online (Sandbox Code Playgroud)

方法三
loc

df.loc[df.index.levels[0][:10].tolist()]
Run Code Online (Sandbox Code Playgroud)