我试图找到一种直接的方法来更改 Pandas DatafFrame 多索引中的值顺序。为了说明我的意思,假设我们有一个带有多索引的 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 如下:
我想要做的是在 level0 和 level1 中将 Multiindex 的序列从“C D M”(按字母顺序排列)更改为“C M D”。我曾尝试使用 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”的顺序获得索引。抱歉没有说清楚。
最佳答案
使用 reindex
通过新 MultiIndex.from_product
:
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
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
编辑:
如果需要设置订购创建ordered CategoricalIndex然后简单地
sort_index
: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
查询
unstack
对于新订购:print (df.unstack())
C M D
level1 C M D C M D C M D
level0
C 6 9 5 2 9 4 9 7 6
M 0 8 7 7 1 9 8 2 4
D 9 5 1 6 6 0 6 7 6
关于pandas - 使用 multiindex 更改 pandas DataFrame 中的索引顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48851880/