【问题标题】:Change the order of index in pandas DataFrame with multiindex使用 multiindex 更改 pandas DataFrame 中的索引顺序
【发布时间】:2018-07-28 20:16:36
【问题描述】:

我正在尝试找到一种简单的方法来更改 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”的顺序获得索引。抱歉没有说清楚。

【问题讨论】:

    标签: pandas dataframe multi-index reindex


    【解决方案1】:

    通过新的MultiIndex.from_product 使用reindex

    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
    

    【讨论】:

    • 感谢您的快速回复——非常感谢。我确实有另一个问题没有通过这种方法解决。我已经编辑了这个问题。很抱歉没有明确目标。
    猜你喜欢
    • 2012-10-02
    • 2019-07-17
    • 1970-01-01
    • 1970-01-01
    • 2023-01-13
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多