如何在 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】:使用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
【讨论】:
【参考方案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 中“取消透视”特定列?