答案 0 :(得分:1)
将stack
与level
参数一起使用:
df.stack(level=[0,1]).reset_index()
输出:
level_0 level_1 level_2 level_3 0
0 A Y 01.02.2018 City 1 1
1 A Y 01.02.2018 City 2 2
2 A Y 01.02.2018 City 3 3
3 A Y 01.03.2018 City 1 2
4 A Y 01.03.2018 City 2 3
5 A Y 01.03.2018 City 3 4
6 B U 01.02.2018 City 1 4
7 B U 01.02.2018 City 2 5
8 B U 01.02.2018 City 3 6
9 B U 01.03.2018 City 1 5
10 B U 01.03.2018 City 2 6
11 B U 01.03.2018 City 3 7
12 C O 01.02.2018 City 1 7
13 C O 01.02.2018 City 2 8
14 C O 01.02.2018 City 3 9
15 C O 01.03.2018 City 1 8
16 C O 01.03.2018 City 2 9
17 C O 01.03.2018 City 3 10
18 D P 01.02.2018 City 1 10
19 D P 01.02.2018 City 2 11
20 D P 01.02.2018 City 3 12
21 D P 01.03.2018 City 1 11
22 D P 01.03.2018 City 2 12
23 D P 01.03.2018 City 3 13
并且,清理列名称可以使用set_axis
:
df.stack(level=[0,1]).reset_index().set_axis(['', '', 'date','name city','value'], axis=1, inplace=False)
输出(头):
date name city value
0 A Y 01.02.2018 City 1 1
1 A Y 01.02.2018 City 2 2
2 A Y 01.02.2018 City 3 3
3 A Y 01.03.2018 City 1 2
4 A Y 01.03.2018 City 2 3
答案 1 :(得分:0)
另一种方法是:
index = df.loc[:, df.columns.get_level_values(1)==''].columns.tolist()
values = df.loc[:, df.columns.get_level_values(1)!=''].columns.tolist()
df = df.melt(id_vars=index, value_vars=values)
您可以随后根据需要命名列。