使用multiindex更改pandas DataFrame中索引的顺序

时间:2018-02-18 12:52:15

标签: pandas dataframe multi-index reindex

我试图找到一种直接的方法来改变pandas DatafFrame多索引中的值的顺序。为了说明我的意思,假设我们有一个带有multiindex的DataFrame定义如下:

index = pd.MultiIndex(levels=[[u'C', u'D', u'M'], [u'C', u'D', u'M']],
           labels=[[0, 0, 0, 1, 1, 1, 2, 2, 2], [0, 1, 2, 0, 1, 2, 0, 1, 2]],
           names=[u'level0', u'level1'])

df = pd.DataFrame(np.random.randint(10,size=(9,3)),index=index,columns=['C','M','D'])

所以我们有一个DataFrame df如下:

enter image description here

我要做的是从" C D M"更改多指数的顺序。 (按字母顺序排列)到" C M D"在level0和level1中。我曾尝试使用pd.reindex,但还没有找到实现这一目标的简便方法。

Jezrael在下面给出了一个正确显示的答案:

L = list('CMD')
mux = pd.MultiIndex.from_product([L, L], names=df.index.names)
df = df.reindex(mux)
print (df)

然而,我需要的是指数的水平大约为" C M D"同样。如果我们检查df.index,我们会得到以下结果:

MultiIndex(levels=[[u'C', u'D', u'M'], [u'C', u'D', u'M']],
           labels=[[0, 0, 0, 2, 2, 2, 1, 1, 1], [0, 2, 1, 0, 2, 1, 0, 2, 1]],
           names=[u'level0', u'level1'])

注意"等级"仍然是" C D M"的顺序。我想要的是,当我使用df.unstack()时,我仍然按照" C M D"的顺序得到索引。很抱歉没有说清楚。

1 个答案:

答案 0 :(得分:1)

reindex使用MultiIndex.from_product

array_push($result, $t);
np.random.seed(2018)
index = pd.MultiIndex(levels=[[u'C', u'D', u'M'], [u'C', u'D', u'M']],
           labels=[[0, 0, 0, 1, 1, 1, 2, 2, 2], [0, 1, 2, 0, 1, 2, 0, 1, 2]],
           names=[u'level0', u'level1'])

df = pd.DataFrame(np.random.randint(10,size=(9,3)),
                  index=index,columns=['C','M','D'])
print (df)
               C  M  D
level0 level1         
C      C       6  2  9
       D       5  4  6
       M       9  9  7
D      C       9  6  6
       D       1  0  6
       M       5  6  7
M      C       0  7  8
       D       7  9  4
       M       8  1  2

编辑:

如果需要设置排序,请创建ordered CategoricalIndex,然后只需sort_index

L = list('CMD')
mux = pd.MultiIndex.from_product([L, L], names=df.index.names)
df = df.reindex(mux)
print (df)
               C  M  D
level0 level1         
C      C       6  2  9
       M       9  9  7
       D       5  4  6
M      C       0  7  8
       M       8  1  2
       D       7  9  4
D      C       9  6  6
       M       5  6  7
       D       1  0  6

检查unstack是否有新订单:

L = pd.CategoricalIndex(list('CDM'), ordered=True, categories=list('CMD'))
df.index = pd.MultiIndex.from_product([L, L], names=df.index.names)
df = df.sort_index()
print (df)
               C  M  D
level0 level1         
C      C       6  2  9
       M       9  9  7
       D       5  4  6
M      C       0  7  8
       M       8  1  2
       D       7  9  4
D      C       9  6  6
       M       5  6  7
       D       1  0  6