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

标签 pandas dataframe multi-index reindex

我试图找到一种直接的方法来更改 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 如下:

enter image description here

我想要做的是在 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/

相关文章:

scala - 在 spark 中加入两个数据帧以仅返回一个匹配项

pandas - pd.concating 多个小计行时不保留 MultiIndex

python - 将字符串类型、三级MultiIndex的pandas dataframe转换为数字类型对象

python - Pandas 计算满足条件的行的列平均值

python - 如何使用 Pandas 计算 GroupBy 对象的滚动平均值?

Python Pandas 根据列的数据类型删除行

r - 在 data.frame 的 ggplot 图例中添加信息

python - 在 Pandas DataFrame 中转置选定的 MultiIndex 级别

python - 如何注释堆积图或面积图

python - Pandas 中的 join 和 merge 有什么区别?