有很多关于按级别范围1分割多索引的级别[0]的帖子。但是,我找不到解决我的问题的方法;也就是说,我需要 level[0] 索引值的 level1 索引范围
dataframe:首先是A到Z,Rank是1到400;我需要每个 level[0] (第一个)的前 2 个和最后 2 个,但不在同一步骤中。
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
我试图使用下面的代码获取每个级别1索引的最后两行,但它仅针对第一个级别[0]值正确切片。
[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
我通过交换索引获得前两行,但我无法使其适用于最后两行。
df.index = df.index.swaplevel("Rank", "First")
df= df.sortlevel() #to sort by Rank
df.ix[1:2] #Produces the first 2 ranks with 2 level[1] (First) each.
Title Score
Rank First
1 A foo 100
B foo 400
2 A bar 90
B lime 300
当然我可以把它换回来得到这个:
df2 = df.ix[1:2]
df2.index = ttt.index.swaplevel("First","rank") #change the order of the indices back.
df2.sortlevel()
Title Score
First Rank
A 1 foo 100
2 bar 90
B 1 foo 400
2 lime 300
任何帮助都可以通过相同的程序获得:
编辑@ako 的以下反馈:
使用
pd.IndexSlice
确实可以轻松地对任何级别索引进行切片。这是一个更通用的解决方案,下面是我获取第一行和最后两行的逐步方法。更多信息在这里: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
# Top 2
df.loc[idx[:,[1,2],:] #[1,2] is NOT a row index, it is the rank label.
# Last 2
max = len(df.index.levels[df.index.names.index("rank")]) # unique rank labels
last2=[x for x in range(max-2,max)]
df.loc[idx[:,last2],:] #for last 2 - assuming all level[0] have the same lengths.
使用索引器以任意维度对任意值进行切片 - 只需传递一个列表,其中包含该维度所需的级别/值。
idx = pd.IndexSlice
df.loc[idx[:,[3,4]],:]
Title Score
First Rank
A 3 lime 80
4 lame 70
B 3 lame 200
4 dime 100
用于复制数据:
from io import StringIO
s="""
First Rank Title Score
A 1 foo 100
A 2 bar 90
A 3 lime 80
A 4 lame 70
B 1 foo 400
B 2 lime 300
B 3 lame 200
B 4 dime 100
"""
df = pd.read_csv(StringIO(s),
sep='\s+',
index_col=["First", "Rank"])