按位置切片MultiIndex pandas DataFrame

时间:2016-12-22 17:47:14

标签: python pandas multi-index

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

body {
  background: #535686;
  font-size: 22px
}
a {
  text-decoration: none
}
#learnmore,
#learnmore:link,
#learnmore:visited,
#learnmore:active {
  padding: 10px;
  border: 2px solid white;
  color: white;
}
#learnmore {
  margin: 10px;
}
#learnmore:hover {
  background: white;
  color: #535686
}

目前我可以实现:

<div id="offer">
  <img src="imgs/detroit.jpeg" title="" alt="">
  <h1>Offer Header</h1>
  <p>Here is a little bit of information about our offer.</p>
  <a href="" id="learnmore">Learn More</a>
  <a href="" id="scrolldown"></a>
</div>

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

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

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

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

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

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

有很多方法可以实现这个目的,但是我发帖是因为我想知道我做错了什么,或者为什么我不能期望能够以这种方式切割MultiIndexes。

2 个答案:

答案 0 :(得分:4)

方法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()]

答案 1 :(得分:1)

你可以组合级别并以这种方式取得前两名

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