Python Pandas按二级索引(或任何其他级别)切片multiindex

关于将multiindex的level [0]划分为1级范围的文章很多。但是,我找不到解决问题的方法。也就是说,对于level

[0]索引值,我需要一个级别为1的索引

数据帧:首先是A到Z,等级是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索引的最后2行,但它仅对第一个level [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

我通过交换索引获得了前2行,但是我无法使其适用于后2行。

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

希望通过相同的步骤获得任何帮助:

  • 索引1(排名)的最后2行
  • 以及获得前两行的更好方法


通过@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 StringIO 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"])

以上是 Python Pandas按二级索引(或任何其他级别)切片multiindex 的全部内容, 来源链接: utcz.com/qa/411830.html

回到顶部