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
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
添加回答
举报