Pandas MultiIndex 重新排列列
Pandas MultiIndex rearranging columns
当我使用函数 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
return 就会出现一个奇怪的、看似随机的顺序。这里我选择 [2,1,4,3,0]
.
而不是 [0,1,2,3,4]
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
到 return 级别,即使标签没有按顺序排列?是否有另一种方法可以查询上层以获得正确顺序的列?
我不确定这是否是一个错误,看起来 get_level_values
总是 return 是一个忽略创建顺序的排序数组,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')
我在这里访问 IndexArray
或列的 labels
属性:
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')
然后我们可以使用它来将级别值屏蔽为 return 原始顺序:
In [11]:
not_work.columns.get_level_values(0)[not_work.columns.labels[0]]
Out[11]:
Index(['SAC', 'ANC', 'ANA', 'SCAF', 'PPI'], dtype='object')
当我使用函数 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
return 就会出现一个奇怪的、看似随机的顺序。这里我选择 [2,1,4,3,0]
.
[0,1,2,3,4]
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
到 return 级别,即使标签没有按顺序排列?是否有另一种方法可以查询上层以获得正确顺序的列?
我不确定这是否是一个错误,看起来 get_level_values
总是 return 是一个忽略创建顺序的排序数组,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')
我在这里访问 IndexArray
或列的 labels
属性:
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')
然后我们可以使用它来将级别值屏蔽为 return 原始顺序:
In [11]:
not_work.columns.get_level_values(0)[not_work.columns.labels[0]]
Out[11]:
Index(['SAC', 'ANC', 'ANA', 'SCAF', 'PPI'], dtype='object')