Pandas数据框架 - 多级索引/列

3

我是一名有用的助手,可以为您进行文本翻译。

我遇到了一些组织数据框的困难。我认为这很简单,但我已经陷入了太长时间:

这是df1:

     Output Energy, (Wh/h)  Lights (Wh)  Lights+Media (Wh)  Total Usage (h)  \
Hour                                                                           
1                       0.0          0.0                0.0              0.0   
2                       0.0          0.0                0.0              0.0   
3                       0.0          0.0                0.0              0.0   
4                       0.0          0.0                0.0              0.0   
5                       0.0          0.0                0.0              0.0   

为了使用方便,我希望将其转置:

df2 =df1.T

给我:

    Hour                     1    2    3    4   
    Output Energy, (Wh/h)  0.0  0.0  0.0  0.0     
    Lights (Wh)            0.0  0.0  0.0  0.0     
    Lights+Media (Wh)      0.0  0.0  0.0  0.0     
    Total Usage (h)        0.0  0.0  0.0  0.0    
    Lights (h)             0.0  0.0  0.0  0.0  
    Light+Media (h)        0.0  0.0  0.0  0.0  

但最终,我希望它看起来像这样:
                                       Hour
                                  1    2    3    4   
          Output Energy, (Wh/h)  0.0  0.0  0.0  0.0     
          Lights (Wh)            0.0  0.0  0.0  0.0     
CU-101    Lights+Media (Wh)      0.0  0.0  0.0  0.0     
          Total Usage (h)        0.0  0.0  0.0  0.0    
          Lights (h)             0.0  0.0  0.0  0.0  
          Light+Media (h)        0.0  0.0  0.0  0.0  

我一直在尝试将“Cu-101”添加为多级列,但无济于事。我应该在转置之前还是之后添加它?

此外,移动“Hour” - 我将此列设置为索引,但如何将其移动到新级别?


我不确定是否理解您的问题 - 您需要将新字符串添加到“MultiIndex”的第一级吗?还是有什么遗漏?如果答案不是您想要的,请详细说明。 - jezrael
2个回答

5

您可以使用 MultiIndex.from_arrays

df.index = pd.MultiIndex.from_arrays([['Hour'] * len(df.index),
                                      df.index], 
                                      names=(None,None))
df.columns = pd.MultiIndex.from_arrays([['CU-101'] * len(df.columns),
                                        df.columns], 
                                        names=(None,None))

print (df.T)
                             Hour                    
                                1    2    3    4    5
CU-101 Output Energy, (Wh/h)  0.0  0.0  0.0  0.0  0.0
       Lights (Wh)            0.0  0.0  0.0  0.0  0.0
       Lights+Media (Wh)      0.0  0.0  0.0  0.0  0.0
       Total Usage (h)        0.0  0.0  0.0  0.0  0.0

谢谢 @jezrael。在使用df.to_csv将其保存为csv文件时,是否可以保留这个多级索引?目前,hour在每个123上方,cu-101也是如此。 - warrenfitzhenry
这是正确的,查看文档 In [17]: dfIn [21]: df。这是同一个DataFrame,高级别的索引被“稀疏化”以使控制台输出更加清晰易读。 - jezrael
所以如果在 to_csv 后需要使用 read_csv,则需要添加参数 index_col=[0,1],这样才能正确读取多重索引。 - jezrael

2
@jezrael的回答是正确的方法,如果我在写别人要阅读的代码,我也会这样做。但是这里还有一些创造性又快速的方法。 1
df = df.T
df.index = [['CU-101'] * len(df), df.index]
df.columns = [['Hour'] * len(df.columns), df.columns]

2

pd.concat([pd.concat([df.T], keys=['CU-101'])], axis=1, keys=['Hour'])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接