将某些列转换为行,将一列的行转换为 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

Pivotstack

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 转置所必需的。