【问题标题】:Sort multiIndex python pandas dataframe by the order they appear on another data frame按它们出现在另一个数据帧上的顺序对 multiIndex python pandas 数据帧进行排序
【发布时间】:2016-08-25 01:02:58
【问题描述】:

我有一个这样的数据框df

                 a   b
 id   no   name   
T01  101   foo   1  $10
T32  102   bar   2  $30
T10  103   baz   4  $25

其中索引为id, no and name。我有另一个数据框df2,具有我希望的索引顺序

    no
0  103
1  101
2  102

我需要数据框

                 a   b
 id   no   name  
T10  103   baz   4  $25 
T01  101   foo   1  $10
T32  102   bar   2  $30

我见过使用 df.loc[df2.no.values]df.reindex(df2.no) 但由于我有多索引数据帧,它似乎不起作用

我应该使用什么来对键 no 中的 dfdf2 中的顺序进行排序?

【问题讨论】:

    标签: python sorting pandas multi-index


    【解决方案1】:

    reset_indexreindex 和最后一个set_index 的一种可能解决方案:

    print df1.reset_index(level=['id','name'])
             .reindex(df2.no)
             .reset_index()
             .set_index(['id','no','name'])
    
                  a    b
    id  no  name        
    T10 103 baz   4  $25
    T01 101 foo   1  $10
    T32 102 bar   2  $30
    

    如果级别的顺序不重要:

    print df1.reset_index(level=['id','name'])
             .reindex(df2.no)
             .set_index(['id','name'], append=True)
    
                  a    b
    no  id  name        
    103 T10 baz   4  $25
    101 T01 foo   1  $10
    102 T32 bar   2  $30
    

    计时

    In [77]: %timeit df1.unstack([0, 2]).ix[df2.no].stack([1, 2]).swaplevel(0, 1)
    10 loops, best of 3: 18.8 ms per loop
    
    In [78]: %timeit df1.reset_index(level=['id','name']).reindex(df2.no).reset_index().set_index(['id','no','name'])
    The slowest run took 4.41 times longer than the fastest. This could mean that an intermediate result is being cached 
    100 loops, best of 3: 4.41 ms per loop
    

    【讨论】:

      【解决方案2】:

      解决方案

      df.unstack([0, 2]).ix[df2.no].stack([1, 2]).swaplevel(0, 1)
      

      说明

      unstack([0, 2]) 将第 1 和第 3 级索引放入 [-2, -1] 级列中。这将隔离您关心的级别。

      ix[df2.no] 按您喜欢的顺序订购剩余级别。

      stack([1, 2]) 从列中获取级别并将它们放回索引中。

      swaplevel(0, 1) 将索引级别放回原来的顺序。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-06-30
        • 1970-01-01
        • 2020-05-12
        • 2019-04-26
        • 1970-01-01
        • 2013-10-15
        • 2019-09-23
        相关资源
        最近更新 更多