簡體   English   中英

按位置切片MultiIndex pandas DataFrame

[英]Slice MultiIndex pandas DataFrame by position

我目前正在嘗試切片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

目前我可以實現:

df.loc[(slice('03-00368', '04-00361'), slice(None), slice(None)), :]

但實際上我不知道標簽是什么。 我只想選擇前十級0,所以我嘗試了這個(還有很多類似的東西):

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

最終目標是限制顯示的最終行數, 而不會破壞Level0索引

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

請注意,它只返回前兩行,我希望結果如下:

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

有一些hacky方法來完成這個,但我發布是因為我想知道我做錯了什么,或者為什么我不能指望能夠以這種方式切片MultiIndexes。

方法1
groupby + head

df.groupby(level=0).head(10)

方法2
不必要的冗長
IndexSlice

df.sort_index().loc[pd.IndexSlice[df.index.levels[0][:10], :, :], :]

方法3
loc

df.loc[df.index.levels[0][:10].tolist()]

你可以組合級別並以這種方式取得前兩名

df.groupby(level=0).head(2)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM