连接后Pandas排序MultiIndex

时间:2017-09-11 21:00:39

标签: python pandas

当我一次创建一个多索引表时,sortlevel()按预期工作。但是,如果我连接多个表来创建相同的多索引表,我就不能再排序()。完整示例如下:

import pandas as pd
a=pd.DataFrame({'country':'Zimbabwe','name':'Fred'}, index=[1])
b=pd.DataFrame({'country':'Albania','name':'Jeff'}, index=[0])
not_working = pd.concat([a,b],keys=['second','first'])
working = pd.DataFrame({'country':['Zimbabwe','Albania'],'name':['Fred','Jeff']}, index=pd.MultiIndex.from_tuples([('second',1),('first',0)]))

not_working_sorted = not_working.sortlevel(0)
working_sorted = working.sortlevel(0)

我希望这两个产生:

           country  name
first  0   Albania  Jeff
second 1  Zimbabwe  Fred

然而,我只是因为“工作”而得到的。谁知道我做错了什么?使用pandas 0.19.2

2 个答案:

答案 0 :(得分:4)

试试这个?

working.sort_index()
Out[702]: 
           country  name
first  0   Albania  Jeff
second 1  Zimbabwe  Fred

或更具体的

working.sort_index(level=[0, 1], ascending=[True, False])

编辑:您的多个索引标签显示如下。

not_working.index
Out[565]: 
MultiIndex(levels=[['second', 'first'], [0, 1]],
           labels=[[0, 1], [1, 0]])
working.index
Out[566]: 
MultiIndex(levels=[['first', 'second'], [0, 1]],
           labels=[[1, 0], [1, 0]])

因此,如果您希望not_working排序工作:

not_working.sort_index(level=[0, 1], ascending=[False, False])
Out[567]: 
           country  name
first  0   Albania  Jeff
second 1  Zimbabwe  Fred

答案 1 :(得分:3)

不推荐使用 sortlevel(),因此请尝试使用sort_index()

not_working.sort_index(level = 1)

并且

working.sort_index(level = 1)

你得到了

            country     name
first   0   Albania     Jeff
second  1   Zimbabwe    Fred