如何在熊猫数据框中创建列层次结构索引

时间:2019-01-02 10:28:18

标签: python pandas pivot

我有两个看起来像下面的数据框

Datframe A:

dataDate  name prediction       
2018-09-30  A   2.30
2018-10-01  A   1.51
2018-10-02  A   2.08
2018-10-03  A   1.82
2018-09-30  B   0.96
2018-10-01  B   6.52
2018-10-02  B   9.21
2018-10-03  B   17.43
2018-09-30  C   6.89    
2018-10-01  C   6.10
2018-10-02  C   5.53
2018-10-03  C   1.91

我想在列中创建层次结构索引时转换数据框架,以便我可以同时访问几个列。因此,例如:-

数据框B:

dataDate   prediction       
           Group pred
2018-09-30  A    2.30
2018-10-01  A    1.51
2018-10-02  A    2.08
2018-10-03  A    1.82
2018-09-30  B    0.96
2018-10-01  B    6.52
2018-10-02  B    9.21
2018-10-03  B    17.43
2018-09-30  C    6.89    
2018-10-01  C    6.10
2018-10-02  C    5.53
2018-10-03  C    1.91

数据框B仅具有两列“ dataDate”和“ prediction”,然后预测具有“ level 1”两列“ Group”和“ pred”。现在,我只需预测即可访问它们。

请帮助我用熊猫将数据框B从数据框A转换为反之吗?

1 个答案:

答案 0 :(得分:3)

如有必要,请在第一列中使用set_indexDatatimeIndex,然后通过MultiIndex.from_product分配新的MultiIndex

df = df.set_index('dataDate')
df.columns = pd.MultiIndex.from_product([['prediction'],['Group','pred']])
#alternative
#df.columns = [['prediction'] * len(df.columns),['Group','pred']]
print (df)
           prediction       
                Group   pred
dataDate                    
2018-09-30          A   2.30
2018-10-01          A   1.51
2018-10-02          A   2.08
2018-10-03          A   1.82
2018-09-30          B   0.96
2018-10-01          B   6.52
2018-10-02          B   9.21
2018-10-03          B  17.43
2018-09-30          C   6.89
2018-10-01          C   6.10
2018-10-02          C   5.53
2018-10-03          C   1.91

对于转换,我建议不要在第一级中更改列名称,仅定义新级别Group

df1 = df.set_index('dataDate')
df1.columns = pd.MultiIndex.from_product([['Group'],df1.columns])
print (df1)
           Group           
            name prediction
dataDate                   
2018-09-30     A       2.30
2018-10-01     A       1.51
2018-10-02     A       2.08
2018-10-03     A       1.82
2018-09-30     B       0.96
2018-10-01     B       6.52
2018-10-02     B       9.21
2018-10-03     B      17.43
2018-09-30     C       6.89
2018-10-01     C       6.10
2018-10-02     C       5.53
2018-10-03     C       1.91

df = df1['Group'].copy()
print (df)
           name  prediction
dataDate                   
2018-09-30    A        2.30
2018-10-01    A        1.51
2018-10-02    A        2.08
2018-10-03    A        1.82
2018-09-30    B        0.96
2018-10-01    B        6.52
2018-10-02    B        9.21
2018-10-03    B       17.43
2018-09-30    C        6.89
2018-10-01    C        6.10
2018-10-02    C        5.53
2018-10-03    C        1.91