首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pandas按二级索引(或任何其他级别)切片多个索引

Pandas按二级索引(或任何其他级别)切片多个索引
EN

Stack Overflow用户
提问于 2015-10-18 03:32:42
回答 2查看 17K关注 0票数 21

关于将多个索引的级别划分为一个级别的1,有很多帖子。但是,我无法找到解决问题的方法;也就是说,我需要级别索引值的级别1索引的范围。

数据:首先是A到Z,等级是1到400;对于每个级别的0,我需要前2和最后2,但不是在同一步。

代码语言:javascript
复制
           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行,但是它只对第一个级别的值进行适当的分割。

代码语言:javascript
复制
[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行工作。

代码语言:javascript
复制
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

当然,我可以用这个换回来:

代码语言:javascript
复制
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行(等级)
  • 还有一个更好的方法来获得前2行

通过@ako编辑以下反馈:

使用pd.IndexSlice确实可以方便地分割任何级别的索引。这里有一个更通用的解决方案,在我的分步方法下面,可以得到前两行和最后两行。这里有更多信息:http://pandas.pydata.org/pandas-docs/stable/advanced.html#using-slicers

代码语言:javascript
复制
"""    
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.
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-18 04:51:29

使用索引器对任意维度中的任意值进行切片--只需传递一个列表,其中包含该维度所需的级别/值。

代码语言:javascript
复制
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

用于复制数据:

代码语言:javascript
复制
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"])
票数 36
EN

Stack Overflow用户

发布于 2020-03-24 16:26:24

在多层索引中按任意级别切片的另一种方法是将slice(None).loc[]结合使用。.loc[]将对多级索引使用元组,使用slice(None)表示特定索引未被切片,然后为被切片的索引传递单个项或列表。希望它能帮助未来的读者

代码语言:javascript
复制
df.loc[ ( slice(None), [3, 4] ),  : ]
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33194016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档