Pandas:以给定顺序包含行和列的

时间:2016-03-19 16:12:39

标签: pandas dataframe pivot

我有一个带有分层行的数据帧,这是转置数据透视的结果。第二行索引是一个数字,并按升序排序(这是我想要的),但第一行索引是一个字符串,并按字母顺序排序(我不想要)。同样,列名是字符串,按字母顺序排序,我不想要。

如何重新组织数据框,以便按行我想要的顺序显示行和列?我唯一要做的就是重新命名,在开头添加一个数字,但它很麻烦,如果可能的话,我宁愿避免使用它。

我的数据的最小示例如下所示。

import pandas as pd
import numpy as np

consdf=pd.DataFrame()

for mylocation in ['North','South']:
    for scenario in np.arange(1,4):
        df= pd.DataFrame()
        df['mylocation'] = [mylocation]
        df['scenario']= [scenario]
        df['this'] = np.random.randint(10,100)
        df['that'] = df['this']  * 2
        df['something else']  = df['this'] * 3
        consdf=pd.concat((consdf, df ), axis=0, ignore_index=True)

mypiv = consdf.pivot('mylocation','scenario').transpose()

关于潜在重复的注释

我理解已经提出了类似的问题,但我无法将这些解决方案应用于我的多索引。

1 个答案:

答案 0 :(得分:2)

函数reindex就是为了这个,只是适应管理列:

In [1]: mypiv
Out[1]: 
mylocation               North  South
               scenario              
this           1            24     11
               2            19     53
               3            11     92
that           1            48     22
               2            38    106
               3            22    184
something else 1            72     33
               2            57    159
               3            33    276


In [2]: mypiv.reindex(['that', 'this', 'something else'], level=0) \
.T.reindex(['South','North']).T
Out[2]: 
mylocation               South  North
               scenario              
that           1            90     34
               2            50    104
               3           100    170
this           1            45     17
               2            25     52
               3            50     85
something else 1           135     51
               2            75    156
               3           150    255