代码之家  ›  专栏  ›  技术社区  ›  rocksteady

使用Python/Pandas将数据帧转换为多个列组

  •  1
  • rocksteady  · 技术社区  · 7 年前

    我在Python中尝试了许多不同的方法来实现这一点,我确信我遗漏了一些东西。我的数据如下:

    Date | Stock 1 | Stock 2 | Stock 3 
    11-30-86    2.45    0.47021 1.45879  
    12-31-86    -2.57   1.09626 -2.67784  
    01-31-87    13.5    9.33911 11.14448  
    02-28-87    3.99    4.63777 5.96181  
    

    我想做的是按股票名称(列名)转置数据,并将其呈现如下:

    Stock Name | Date | Return
    Stock 1 11-30-86    2.45  
    Stock 2 11-30-86    0.47021  
    Stock 3 11-30-86    1.45879  
    Stock 1 12-31-86    -2.57  
    Stock 2 12-31-86    1.09626  
    Stock 3 12-31-86    -2.67784  
    Stock 1 01-31-87    13.5  
    Stock 2 01-31-87    9.33911  
    Stock 3 01-31-87    11.14448  
    Stock 1 02-28-87    3.99  
    Stock 2 02-28-87    4.63777  
    Stock 3 02-28-87    5.96181 
    

    我尝试了Pandas pivot/unpivot和transpose的不同排列,但我似乎无法做到这一点-我只对整个表进行了数据透视,我想按组使用不同的列名,并得到结果的单个列。

    我错过了什么?

    2 回复  |  直到 7 年前
        1
  •  1
  •   Scott Boston    7 年前

    尝试使用melt:

    df.melt(id_vars='Date', var_name='Stock Name', value_name='Return')
    

    输出:

            Date Stock Name    Return
    0   11-30-86    Stock 1   2.45000
    1   12-31-86    Stock 1  -2.57000
    2   01-31-87    Stock 1  13.50000
    3   02-28-87    Stock 1   3.99000
    4   11-30-86    Stock 2   0.47021
    5   12-31-86    Stock 2   1.09626
    6   01-31-87    Stock 2   9.33911
    7   02-28-87    Stock 2   4.63777
    8   11-30-86    Stock 3   1.45879
    9   12-31-86    Stock 3  -2.67784
    10  01-31-87    Stock 3  11.14448
    11  02-28-87    Stock 3   5.96181
    
        2
  •  1
  •   BENY    7 年前

    有两种方法 melt stack

    df.melt('Date')
    Out[1303]: 
            Date variable     value
    0   11-30-86   Stock1   2.45000
    1   12-31-86   Stock1  -2.57000
    2   01-31-87   Stock1  13.50000
    3   02-28-87   Stock1   3.99000
    4   11-30-86   Stock2   0.47021
    5   12-31-86   Stock2   1.09626
    6   01-31-87   Stock2   9.33911
    7   02-28-87   Stock2   4.63777
    8   11-30-86   Stock3   1.45879
    9   12-31-86   Stock3  -2.67784
    10  01-31-87   Stock3  11.14448
    11  02-28-87   Stock3   5.96181
    df.set_index('Date').stack().reset_index()
    Out[1304]: 
            Date level_1         0
    0   11-30-86  Stock1   2.45000
    1   11-30-86  Stock2   0.47021
    2   11-30-86  Stock3   1.45879
    3   12-31-86  Stock1  -2.57000
    4   12-31-86  Stock2   1.09626
    5   12-31-86  Stock3  -2.67784
    6   01-31-87  Stock1  13.50000
    7   01-31-87  Stock2   9.33911
    8   01-31-87  Stock3  11.14448
    9   02-28-87  Stock1   3.99000
    10  02-28-87  Stock2   4.63777
    11  02-28-87  Stock3   5.96181