[英]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
。
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.