简体   繁体   English

在 Pandas DataFrame 中重新排序 MultiIndex 的级别

[英]Reorder levels of MultiIndex in a pandas DataFrame

I have a DataFrame that looks something like this:我有一个看起来像这样的 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

But I actually want my index to be ordered 'Letter, Color, Number'.但我实际上希望我的索引按“字母、颜色、数字”排序。

I currently do this as follows:我目前这样做如下:

>>> 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

Is this the best approach?这是最好的方法吗?

It's better to use reorder_levels to manipulate the order of MultiIndex levels.最好使用reorder_levels来操纵 MultiIndex 级别的顺序。 Just pass in a list of the level names/numbers in the order you want:只需按照您想要的顺序传入级别名称/编号列表:

>>> 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

There's also swaplevel if you simply want to swap the positions of two levels.如果您只想交换两个级别的位置,也可以使用swaplevel

Inplace Modification就地修改

Call MultiIndex.reorder_levels , then assign the new index to your DataFrame.调用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

Since Index objects are immutable, you cannot get over creating a new Index, but you can avoid duplicating your data by otherwise calling df.reorder_levels .由于 Index 对象是不可变的,因此您无法克服创建新 Index 的困难,但您可以通过调用df.reorder_levels来避免复制数据。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM