如何在2级参数的pandas中取消

时间:2018-03-29 14:20:49

标签: pandas unpivot

我的数据框如下图所示: my df

pandas如何取消这些数据,看起来像是图像? finish data

我尝试使用df.unstack(),但没有

2 个答案:

答案 0 :(得分:1)

stacklevel参数一起使用:

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)

您可以随后根据需要命名列。