Python “取消堆栈”不应对剩余索引进行排序

Python “取消堆栈”不应对剩余索引进行排序,python,pandas,sorting,Python,Pandas,Sorting,我在问自己,是否有可能取消多索引数据帧的一个级别的堆栈,以使返回的数据帧的其余索引不排序! 代码示例: arrays = [["room1", "room1", "room1", "room1", "room1", "room1", "room2", "room2", "room2", "room2", "room2", "room2"], ["bed1", "bed1", "bed1", "bed2", "bed2", "bed2",

我在问自己,是否有可能取消多索引数据帧的一个级别的堆栈,以使返回的数据帧的其余索引不排序! 代码示例:

arrays = [["room1", "room1", "room1", "room1", "room1", "room1",
           "room2", "room2", "room2", "room2", "room2", "room2"],
          ["bed1", "bed1", "bed1", "bed2", "bed2", "bed2",
           "bed1", "bed1", "bed1", "bed2", "bed2", "bed2"],
          ["blankets", "pillows", "all", "blankets", "pillows", "all",
           "blankets", "pillows", "all", "blankets", "pillows", "all"]]

tuples = list(zip(*arrays))

index = pd.MultiIndex.from_tuples(tuples, names=['first index', 
                                                 'second index', 'third index'])

series = pd.Series([1, 2, 3, 1, 1, 2, 2, 2, 4, 2, 1, 3 ], index=index)

series

first index  second index  third index
room1        bed1          blankets       1
                           pillows        2
                           all            3
             bed2          blankets       1
                           pillows        1
                           all            2
room2        bed1          blankets       2
                           pillows        2
                           all            4
             bed2          blankets       2
                           pillows        1
                           all            3
取消第二个索引的堆叠:

series.unstack(1)

second index             bed1  bed2
first index third index            
room1       all             3     2
            blankets        1     1
            pillows         2     1
room2       all             4     3
            blankets        2     2
            pillows         2     1
问题是第三个索引的顺序已经改变,因为该索引是按字母顺序自动排序的。现在,“所有”行是“毯子”和“枕头”行的总和,它是第一行而不是最后一行。那么,如何解决这个问题呢?似乎没有一个选项可以阻止“取消堆栈”自动排序。此外,似乎不可能通过像myDataFrame这样的键对数据帧的索引进行排序

一种可能的解决方案是或带有参数
level=1

s = series.unstack(1).reindex(['blankets','pillows','all'], level=1)
print (s)
second index             bed1  bed2
first index third index            
room1       blankets        1     1
            pillows         2     1
            all             3     2
room2       blankets        2     2
            pillows         2     1
            all             4     3

更具活力的解决方案:

a = series.index.get_level_values('third index').unique()
print (a)
Index(['blankets', 'pillows', 'all'], dtype='object', name='third index')

s = series.unstack(1).reindex_axis(a, level=1)
print (s)
second index             bed1  bed2
first index third index            
room1       blankets        1     1
            pillows         2     1
            all             3     2
room2       blankets        2     2
            pillows         2     1
            all             4     3
a = series.index.get_level_values('third index').unique()
print (a)
Index(['blankets', 'pillows', 'all'], dtype='object', name='third index')

s = series.unstack(1).reindex_axis(a, level=1)
print (s)
second index             bed1  bed2
first index third index            
room1       blankets        1     1
            pillows         2     1
            all             3     2
room2       blankets        2     2
            pillows         2     1
            all             4     3