是否有一种方法可以根据我的个人喜好(例如,按有序列表)对Pandas数据框中的列索引内的特定级别进行重新排序?
In [130]: frame = pd.DataFrame({
...: ('TWO','thing1'):[1,2,3,4],
...: ('TWO','thing4'):[1,2,3,4],
...: ('DARK','thing1'):[0.1,0.2,1,2],
...: ('ANTS','thing3'):['a','e','i','o'],
...: ('ANTS','thing1'):['a','e','i','o']})
In [131]: frame
Out[131]:
ANTS DARK TWO
thing1 thing3 thing1 thing1 thing4
0 a a 0.1 1 1
1 e e 0.2 2 2
2 i i 1.0 3 3
3 o o 2.0 4 4
然后,我的列表基于单独生成的列表。需要特别注意的是,我不知道level 0
或level 1
索引标签-它们是变量。
In [132]: sort_list = ['DARK', 'ANTS', 'TWO']
如果我随后尝试在frame = frame[sort_list]
或.reindex(columns=sort_list)
的上下文中传递此列表,则出于明显的原因,它将抛出Expected tuple, got str
。 Here是适用于单级索引的解决方案。
我想做的只是在顶层进行排序,而在第二层保持原样。最终的数据帧看起来像这样……
DARK ANTS TWO
thing1 thing1 thing3 thing1 thing4
0.1 a a 1 1
0.2 e e 2 2
1.0 i i 3 3
2.0 o o 4 4
答案 0 :(得分:4)
您可以使用reindex
frame.reindex(sort_list, level=0, axis=1)
Out[126]:
DARK ANTS TWO
thing1 thing1 thing3 thing1 thing4
0 0.1 a a 1 1
1 0.2 e e 2 2
2 1.0 i i 3 3
3 2.0 o o 4 4
答案 1 :(得分:2)
您可以对索引进行排序,然后切片
frame.sort_index(axis=1, level=1)[['DARK', 'ANTS', 'TWO']]
DARK ANTS TWO
thing1 thing1 thing3 thing1 thing4
0 0.1 a a 1 1
1 0.2 e e 2 2
2 1.0 i i 3 3
3 2.0 o o 4 4
将列的第一级设置为有序的
frame.columns = frame.columns.set_levels(
pd.CategoricalIndex(
frame.columns.levels[0],
['DARK', 'ANTS', 'TWO'],
ordered=True
), level=0
)
frame.sort_index(axis=1)
DARK ANTS TWO
thing1 thing1 thing3 thing1 thing4
0 0.1 a a 1 1
1 0.2 e e 2 2
2 1.0 i i 3 3
3 2.0 o o 4 4