为了账号安全,请及时绑定邮箱和手机立即绑定

将数据堆叠到具有两个标题的行中,并且第一个标题不合并

将数据堆叠到具有两个标题的行中,并且第一个标题不合并

一只萌萌小番薯 2023-08-08 10:39:44
我有如下 xlsx 数据。      Q1 Q1 Q1 Q2 Q2 Q2      V1 V2 V3 V1 V2 V3  Ram  11 19 10 10 12 14  Syam 11 19 10 10 12 14我必须将其转换为以下格式。        V1 V2 V3 Ram Q1 11 19 10Syam Q1 11 19 10 Ram Q2 10 12 14Syam Q2 10 12 14我无权更改源格式。我已经尝试过如下。df=pd.read_excel(path,sheet_name='Sheet1',header=[0,1],index=[0,1])df.stack(level=0)但它不起作用,因为第一行单元格不是合并格式。寻找任何 pandas 函数来实现此目的
查看完整描述

2 回答

?
九州编程

TA贡献1785条经验 获得超4个赞

index_col=0读入数据时可以设置。然后执行操作:.stack(0)和reset_index()。传递0in.stack(0)确保您将Vs 放在列上,将Qs 放在行上,反之亦然stack(1),因为您的列中有两行的多重索引:


df = (pd.read_excel('Desktop\Book1.xlsx',header=[0,1], index_col=0).stack(0).reset_index()

        .rename({'level_0' : '', 'level_1' : ''}, axis=1))

df

Out[1]: 

             V1  V2  V3

0   Ram  Q1  11  19  10

1   Ram  Q2  10  12  14

2  Syam  Q1  11  19  10

3  Syam  Q2  10  12  14


查看完整回答
反对 回复 2023-08-08
?
桃花长相依

TA贡献1860条经验 获得超8个赞

您好,欢迎来到 StackOverflow!

以下是我为此寻找解决方案所取得的进展。

首先,应读取数据,例如将其Ram作为Syam索引列:

df = pd.read_excel(path,sheet_name='Sheet1',header=[0,1],index_col=0)

那么,你想要的方法是stack(重塑指南)

In [52]: df

Out[52]:

       Q1          Q2

       V1  V2  V3  V1  V2  V3

 Ram   11  19  10  10  12  14

 Syam  11  19  10  10  12  14


In [53]: df.stack()

Out[53]:

              Q1   Q2


 Ram   V1     11   10

       V2     19   12

       V3     10   14

 Syam  V1     11   10

       V2     19   12

       V3     10   14

然而,在没有任何参数的情况下,它会堆叠列的最后一层,正如我们所看到的,这是V. 我们想要堆叠第一层,所以需要调用df.stack(0).


然而,这样做时,会出现错误:ValueError: The name       occurs multiple times, use a level number。对我来说,这看起来像是一个pandas侧面的错误。


编辑: 经过一番调查,我意识到我的级别df具有相同的名称:


In [75]: df.columns

Out[75]:

MultiIndex([(' Q1', ' V1'),

            (' Q1', ' V2'),

            (' Q1', ' V3'),

            (' Q2', ' V1'),

            (' Q2', ' V2'),

            (' Q2', ' V3')],

           names=['     ', '     '])

由(4 个空格)组成    。


相反,如果我们确保级别具有不同的名称:


In [89]: df.columns.names = ['H1', 'H2']


In [90]: df

Out[90]:

H1    Q1          Q2

H2    V1  V2  V3  V1  V2  V3

Ram   11  19  10  10  12  14

Syam  11  19  10  10  12  14

那么我们就可以正确应用df.stack(0):


In [91]: df.stack(0)

Out[91]:

H2         V1   V2   V3

      H1

Ram   Q1   11   19   10

      Q2   10   12   14

Syam  Q1   11   19   10

      Q2   10   12   14


查看完整回答
反对 回复 2023-08-08
  • 2 回答
  • 0 关注
  • 80 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信