我试图找到一种直接的方法来改变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如下:
我要做的是从" 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"的顺序得到索引。很抱歉没有说清楚。
答案 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