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