我有一张表,我想将所有年份列转换为行,而一列的行应转换为列。以下是示例表
城市 | 销售 | 2016 | 2017 | 2018 |
---|---|---|---|---|
A | X | 100 | 120 | 160 |
A | 是 | 90 | 120 | 130 |
A | Z | 130 | 160 | 190 |
B | X | 200 | 220 | 260 |
B | 是 | 290 | 220 | 230 |
B | Z | 230 | 260 | 290 |
C | X | 300 | 320 | 360 |
C | 是 | 390 | 320 | 330 |
C | Z | 330 | 360 | 390 |
决赛桌如下:
城市 | 年 | X | Y | Z |
---|---|---|---|---|
A | 2016 | 100 | 90 | 130 |
A | 2017 | 120 | 120 | 160 |
A | 2018 | 160 | 130 | 190 |
B | 2016 | 200 | 290 | 230 |
B | 2017 | 220 | 220 | 260 |
B | 2018 | 260 | 230 | 290 |
C | 2016 | 300 | 390 | 330 |
C | 2017 | 320 | 320 | 360 |
C | 2018 | 360 | 330 | 390 |
答案 0 :(得分:2)
试试:
>>> df.melt(id_vars = ["City", "Sales"],
value_vars=["2016","2017","2018"],
var_name="Year")
.pivot(index=["City","Year"], columns="Sales", values="value")
Sales X Y Z
City Year
A 2016 100 90 130
2017 120 120 160
2018 160 130 190
B 2016 200 290 230
2017 220 220 260
2018 260 230 290
C 2016 300 390 330
2017 320 320 360
2018 360 330 390
答案 1 :(得分:2)
使用melt
:
>>> df.melt(['City', 'Sales'], var_name='Year', value_name=None) \
.set_index(['City', 'Year', 'Sales']) \
.squeeze().unstack().rename_axis(columns=None)
X Y Z
City Year
A 2016 100 90 130
2017 120 120 160
2018 160 130 190
B 2016 200 290 230
2017 220 220 260
2018 260 230 290
C 2016 300 390 330
2017 320 320 360
2018 360 330 390
答案 2 :(得分:2)
Pivot
和 stack
df.pivot('City', 'Sales').stack(0).rename_axis(['City', 'Year'])
Sales X Y Z
City Year
A 2016 100 90 130
2017 120 120 160
2018 160 130 190
B 2016 200 290 230
2017 220 220 260
2018 260 230 290
C 2016 300 390 330
2017 320 320 360
2018 360 330 390