Pandas MultiIndex重新排列列

时间:2017-01-24 17:07:22

标签: python pandas multi-index

当我使用函数get_level_values获取列值时,MultiIndex会在标签值未对齐时重新排列看似随机的列。

例如,我可以创建一个MultiIndex,其标签从0到4排序。

import pandas as pd
import numpy as np
work_index=pd.MultiIndex(levels=[['ANA','ANC','PPI','SCAF','SAC'],['Sample']],labels=[[0,1,2,3,4],[0,0,0,0,0]])

当我将这个MultiIndex放入一个数据帧并运行get_levels_values函数时,我得到的['ANA','ANC','PPI','SCAF','SAC']按照我希望得到的正确顺序。

work=pd.DataFrame(np.random.randn(5,5),columns=work_index)
work.columns #note the proper order
>>> MultiIndex(levels=[['ANA', 'ANC', 'PPI', 'SCAF', 'SAC'], ['Sample']],
           labels=[[0, 1, 2, 3, 4], [0, 0, 0, 0, 0]])
work.columns.get_level_values(0) #same order as before
>>> Index(['ANA', 'ANC', 'PPI', 'SCAF', 'SAC'], dtype='object')

但是,如果我创建一个标签不是按数字顺序排列的多索引,get_level_values会返回一个奇怪的,看似随机的顺序。我选择[0,1,2,3,4]来代替[2,1,4,3,0]

not_work_index=pd.MultiIndex(levels=[['ANA','ANC','PPI','SCAF','SAC'],['Sample']],labels=[[2, 1, 4, 3, 0],[0,0,0,0,0]])

将其放入数据框并不会给我['ANA','ANC','PPI','SCAF','SAC'],而是['PPI','ANC','SAC','SCAF','ANA']

not_work=pd.DataFrame(np.random.randn(5,5),columns=not_work_index)
not_work.columns
>>> MultiIndex(levels=[['ANA', 'ANC', 'PPI', 'SCAF', 'SAC'], ['Sample']],
       labels=[[2, 1, 4, 3, 0], [0, 0, 0, 0, 0]])
not_work.columns.get_level_values(0)
>>> Index(['PPI', 'ANC', 'SAC', 'SCAF', 'ANA'], dtype='object')

即使标签不符合规定,get_level_values是否有办法按顺序返回级别?是否有另一种方法来查询上层以获得正确顺序的列?

1 个答案:

答案 0 :(得分:1)

我不确定这是不是一个bug,看起来get_level_values总是返回一个忽略创建顺序的排序数组,IndexArray本身知道正确的顺序。您可以使用以下粗糙代码获取所需的顺序,以使label数组掩盖级别值:

In [11]:
not_work.columns.get_level_values(0)[not_work.columns.labels[0]]

Out[11]:
Index(['SAC', 'ANC', 'ANA', 'SCAF', 'PPI'], dtype='object')

在这里,我访问了labels或列的IndexArray属性:

In [12]:
not_work.columns.labels

Out[12]:
FrozenList([[2, 1, 4, 3, 0], [0, 0, 0, 0, 0]])

然后我使用[0]索引第一级:

In [13]:
not_work.columns.labels[0]

Out[13]:
FrozenNDArray([2, 1, 4, 3, 0], dtype='int8')

然后我们可以使用它来屏蔽级别值以返回原始顺序:

In [11]:
not_work.columns.get_level_values(0)[not_work.columns.labels[0]]

Out[11]:
Index(['SAC', 'ANC', 'ANA', 'SCAF', 'PPI'], dtype='object')