如何在 pandas 中为 2 级参数取消透视

Posted

技术标签:

【中文标题】如何在 pandas 中为 2 级参数取消透视【英文标题】:how to unpivot in pandas for 2 level arguments 【发布时间】:2018-03-29 14:20:49 【问题描述】:

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

pandas 如何取消透视这些看起来像图像的数据? finish data

我尝试用 df.unstack() 来做,但什么都没做

【问题讨论】:

欢迎来到 SO。请提供 minimal reproducible example。这意味着没有链接,没有图片,只有文字。 这很可能是 dup 【参考方案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

【讨论】:

【参考方案2】:

另一种方法是:

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)

之后您可以随意命名列。

【讨论】:

以上是关于如何在 pandas 中为 2 级参数取消透视的主要内容,如果未能解决你的问题,请参考以下文章

如何从 pandas DataFrame 中“取消透视”特定列?

取消透视多个变量 Pandas Dataframe

如何取消透视多列数据?

如何根据某些分组列取消pandas数据框? [复制]

如何在 pandas fillna() 方法中为不同的列应用不同的方法参数

如何在 mysql 中取消透视数据