首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >显示前10行多索引熊猫数据

显示前10行多索引熊猫数据
EN

Stack Overflow用户
提问于 2015-09-13 19:20:55
回答 3查看 7.8K关注 0票数 7

我有一个多级指数熊猫DataFrame,第一级是year,第二级是username。我只有一个列,它已经按降序方式排序了。我想显示每个索引级别0的前2行。

我有什么

代码语言:javascript
复制
               count
year username                
2010 b         677
     a         505
     c         400
     d         300
 ...
2014 a         100
     b         80

我想要什么

代码语言:javascript
复制
               count
year username                
2010 b         677
     a         505
2011 c         677
     d         505
2012 e         677
     f         505
2013 g         677
     i         505
2014 h         677
     j         505
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-09-13 21:57:43

这是一个答案。也许有更好的方法来做到这一点(索引?),但我认为它是有效的。这一原则似乎很复杂,但相当简单:

  • 按年份和用户名索引DataFrame
  • 按年份将DataFrame分组,这是索引的第一级(=0)。
  • 在由DataFrame获得的子groupby上应用两个操作(每年一次)
    • 按计数顺序对索引进行排序,sort_index(by='count'),->,具有更多计数的行将位于DataFrame的尾部
    • 仅使用负切片表示法([-top:])保留最后的[-top:]行(在本例中为2行)。还可以使用tail方法(tail(top))来提高可读性。

  • 删除为年份droplevel(0)创建的不必要级别
代码语言:javascript
复制
# Test data    
df = pd.DataFrame({'year': [2010, 2010, 2010, 2011,2011,2011, 2012, 2012, 2013, 2013, 2014, 2014],
                  'username': ['b','a','a','c','c','d','e','f','g','i','h','j'],
                  'count': [400, 505, 678, 677, 505, 505, 677, 505, 677, 505, 677, 505]})
df = df.set_index(['year','username'])

top = 2
df = df.groupby(level=0).apply(lambda df: df.sort_index(by='count')[-top:])
df.index = df.index.droplevel(0)
df

               count
year username       
2010 a           505
     a           678
2011 d           505
     c           677
2012 f           505
     e           677
2013 i           505
     g           677
2014 j           505
     h           677
票数 6
EN

Stack Overflow用户

发布于 2020-03-20 09:01:54

我遇到了同样的问题,在文档中找到了一个更清晰的答案(熊猫1.0.1版):GroupBy:取每组的第一行。下面是一个技巧,假设您的数据被称为df

代码语言:javascript
复制
df.groupby(level=0).head(2)
票数 6
EN

Stack Overflow用户

发布于 2017-06-30 21:20:39

如果您有一个巨大的数据框架,您可能不想做一个groupby仅仅是为了一瞥数据。下面是获取外部索引的前五行和内部索引的前两行的另一种解决方案。

代码语言:javascript
复制
df = pd.DataFrame({'year': [2010, 2010, 2010, 2011,2011,2011, 2012, 2012, 2013, 2013, 2014, 2014],
              'username': ['b','a','a','c','c','d','e','f','g','i','h','j'],
              'count': [400, 505, 678, 677, 505, 505, 677, 505, 677, 505, 677, 505]})
df = df.set_index(['year','username'])

注意,必须对DataFrame进行排序。

代码语言:javascript
复制
df = df.sort_index(level=[0,1])

df
                count
year    username    
2010    a       505
        a       678
        b       400
2011    c       677
        c       505
        d       505
2012    e       677
        f       505
2013    g       677
        i       505
2014    h       677
        j       505

现在是魔术:

代码语言:javascript
复制
def head_mi(df, n1=5, n2=2):

    #get top n of outer index
    top_lev_0 = df.index.levels[0].values[:n1] 

    #get top n of inner index
    top_lev_1 = [df.loc[ind].index.values[:n2] for ind in top_lev_0 ] 
    #top_lev_1 is a list of the inner index values

    #iterate over outer index and get slice from inner index
    acc = []
    for count0, ind0 in enumerate(top_lev_0):
        acc.append(df.loc[(top_lev_0[count0], slice(top_lev_1[count0][0], top_lev_1[count0][-1])),:]) 

    return pd.concat(acc)

head_mi(df)  

这意味着:

代码语言:javascript
复制
                count
year    username    
2010    a       505
        a       678
2011    c       677
        c       505
2012    e       677
        f       505
2013    g       677
        i       505
2014    h       677
        j       505 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32553626

复制
相关文章

相似问题

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