将某些列转换为行,将一列的行转换为 python 中的列
Convert some columns into row and one column's rows into columns in python
我有一个 table,我想在其中将所有年份的列转换为行,并且应将一列的行转换为列。以下是示例 table
城市
销售额
2016
2017
2018
一个
X
100
120
160
一个
Y
90
120
130
一个
Z
130
160
190
B
X
200
220
260
B
Y
290
220
230
B
Z
230
260
290
C
X
300
320
360
C
Y
390
320
330
C
Z
330
360
390
最终 table 看起来像:
城市
年
X
Y
Z
一个
2016
100
90
130
一个
2017
120
120
160
一个
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
尝试:
>>> 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
使用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
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
这正是我要找的!但是,它适用于某些文件,但不适用于具有相同结构的其他文件。不知道为什么,可能太多而无法重复和调整。我发现如果我在 pivot 之前按关键字段对数据框进行排序,它适用于任何文件。因此,在上面的示例中,您至少需要根据键 'City' 进行排序;在我自己的工作中,为了以防万一,我对 'City' 和 'Year' 这两个字段进行了排序。我想到这个是因为它是 SAS proc 转置所必需的。
我有一个 table,我想在其中将所有年份的列转换为行,并且应将一列的行转换为列。以下是示例 table
城市 | 销售额 | 2016 | 2017 | 2018 |
---|---|---|---|---|
一个 | X | 100 | 120 | 160 |
一个 | Y | 90 | 120 | 130 |
一个 | Z | 130 | 160 | 190 |
B | X | 200 | 220 | 260 |
B | Y | 290 | 220 | 230 |
B | Z | 230 | 260 | 290 |
C | X | 300 | 320 | 360 |
C | Y | 390 | 320 | 330 |
C | Z | 330 | 360 | 390 |
最终 table 看起来像:
城市 | 年 | X | Y | Z |
---|---|---|---|---|
一个 | 2016 | 100 | 90 | 130 |
一个 | 2017 | 120 | 120 | 160 |
一个 | 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 |
尝试:
>>> 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
使用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
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
这正是我要找的!但是,它适用于某些文件,但不适用于具有相同结构的其他文件。不知道为什么,可能太多而无法重复和调整。我发现如果我在 pivot 之前按关键字段对数据框进行排序,它适用于任何文件。因此,在上面的示例中,您至少需要根据键 'City' 进行排序;在我自己的工作中,为了以防万一,我对 'City' 和 'Year' 这两个字段进行了排序。我想到这个是因为它是 SAS proc 转置所必需的。