在 Pandas DataFrame 中重新排序 MultiIndex 的级别 [英] Reorder levels of MultiIndex in a pandas DataFrame

查看:117
本文介绍了在 Pandas DataFrame 中重新排序 MultiIndex 的级别的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

<预><代码>>>>df = pd.DataFrame(index=pd.MultiIndex.from_tuples([(num,letter,color)对于范围内的 num(1,3)对于 ['a','b','c'] 中的字母,对于 ['Red','Green']] 中的颜色,名称=['数字','字母','颜色']))>>>df['Value'] = np.random.randint(1,100,len(df))>>>df价值数字字母颜色1 红色 97绿色61b 红 97绿色98c红91绿色472 一个红色 17绿色63b 红色 26绿色73c 红色 34绿色68

但我实际上希望我的索引按字母、颜色、数字"排序.

我目前的做法如下:

<预><代码>>>>df.reset_index().set_index(['Letter','Color','Number'])价值字母颜色编号红色 1 97绿色 1 61b 红色 1 97绿色 1 98c 红色 1 91绿色 1 47红色 2 17绿色 2 63b 红色 2 26绿色 2 73c 红色 2 34绿色 2 68

这是最好的方法吗?

解决方案

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

<预><代码>>>>df.reorder_levels(['Letter','Color','Number'])价值字母颜色编号红色 1 41绿色 1 56b 红色 1 43绿色 1 42c 红色 1 89绿色 1 18红色 2 55绿色 2 93b 红色 2 64绿色 2 9c 红色 2 21绿色 2 93

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

I have a DataFrame that looks something like this:

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

这篇关于在 Pandas DataFrame 中重新排序 MultiIndex 的级别的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆