There are many reports about the cut of level [0] of a multi-index into a range of level 1 . However, I cannot find a solution to my problem; that is, I need a level 1 range index for index values ββ[0]
dataframe: first from A to Z, Rank - from 1 to 400; I need the first 2 and last 2 for each level [0] (first), but not at the same step.
Title Score First Rank A 1 foo 100 2 bar 90 3 lime 80 4 lame 70 B 1 foo 400 2 lime 300 3 lame 200 4 dime 100
I am trying to get the last 2 lines for each level 1 with the code below, but it only cuts correctly for the first level [0] value.
[IN] df.ix[x.index.levels[1][-2]:] [OUT] Title Score First Rank A 3 lime 80 4 lame 70 B 1 foo 400 2 lime 300 3 lame 200 4 dime 100
The first 2 lines I get by replacing the indices, but I can't get it to work for the last two lines.
df.index = df.index.swaplevel("Rank", "First") df= df.sortlevel()
Of course, I can change this to get the following:
df2 = df.ix[1:2] df2.index = ttt.index.swaplevel("First","rank")
Any help would be appreciated with the same procedure:
- Last 2 rows for index 1 (Rank)
- And the best way to get the first 2 lines
Edit the following feedback from @ako:
Using pd.IndexSlice really makes it easy to crop any level index. Here is a more general solution and below my phased approach to get the first and last two lines. More information here: http://pandas.pydata.org/pandas-docs/stable/advanced.html#using-slicers
""" Slicing a dataframe at the level[2] index of the major axis (row) for specific and at the level[1] index for columns. """ df.loc[idx[:,:,['some label','another label']],idx[:,'yet another label']] """ Thanks to @ako below is my solution, including how I get the top and last 2 rows. """ idx = pd.IndexSlice
python sorting pandas slice multi-index
raummensch
source share