【问题标题】:Reorder levels of MultiIndex in a pandas DataFrame在 pandas DataFrame 中重新排序 MultiIndex 的级别
【发布时间】:2016-03-05 22:03:29
【问题描述】:

我有一个看起来像这样的 DataFrame:

>>> df = pd.DataFrame(index=pd.MultiIndex.from_tuples([(num,letter,color) 
                    for num in range(1,3) 
                    for letter in ['a','b','c'] for color in ['Red','Green']], 
                    names=['Number','Letter','Color']))
>>> df['Value'] = np.random.randint(1,100,len(df))
>>> df
                     Value
Number Letter Color       
1      a      Red       97
              Green     61
       b      Red       97
              Green     98
       c      Red       91
              Green     47
2      a      Red       17
              Green     63
       b      Red       26
              Green     73
       c      Red       34
              Green     68

但我实际上希望我的索引按“字母、颜色、数字”排序。

我目前这样做如下:

>>> df.reset_index().set_index(['Letter','Color','Number'])
                     Value
Letter Color Number       
a      Red   1          97
       Green 1          61
b      Red   1          97
       Green 1          98
c      Red   1          91
       Green 1          47
a      Red   2          17
       Green 2          63
b      Red   2          26
       Green 2          73
c      Red   2          34
       Green 2          68

这是最好的方法吗?

【问题讨论】:

    标签: python pandas dataframe multi-index


    【解决方案1】:

    最好使用reorder_levels 来操作MultiIndex 级别的顺序。只需按您想要的顺序传入关卡名称/编号列表:

    >>> df.reorder_levels(['Letter','Color','Number'])
                         Value
    Letter Color Number       
    a      Red   1          41
           Green 1          56
    b      Red   1          43
           Green 1          42
    c      Red   1          89
           Green 1          18
    a      Red   2          55
           Green 2          93
    b      Red   2          64
           Green 2           9
    c      Red   2          21
           Green 2          93
    

    如果你只是想交换两个级别的位置,还有swaplevel

    【讨论】:

    • 有没有办法做到这一点?
    • @BallpointBen 添加了一个答案——您可以直接在索引上调用reorder_levels
    【解决方案2】:

    就地修改

    调用MultiIndex.reorder_levels,然后将新索引分配给您的DataFrame。

    df.index = df.index.reorder_levels(['Letter', 'Color', 'Number']) 
    df
    
                         Value
    Letter Color Number       
    a      Red   1          41
           Green 1          56
    b      Red   1          43
           Green 1          42
    c      Red   1          89
           Green 1          18
    a      Red   2          55
           Green 2          93
    b      Red   2          64
           Green 2           9
    c      Red   2          21
           Green 2          93
    

    由于索引对象是不可变的,您无法克服创建新索引的问题,但您可以通过调用 df.reorder_levels 来避免重复数据。

    【讨论】:

      猜你喜欢
      • 2017-10-16
      • 1970-01-01
      • 1970-01-01
      • 2019-02-16
      • 2016-12-01
      • 2018-06-24
      • 2019-03-05
      • 1970-01-01
      相关资源
      最近更新 更多