使用 Python/Pandas 转置具有多个列组的数据框

Using Python/Pandas to transpose a dataframe with multiple column groups

我在 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 和转置的不同排列,但我似乎无法让它工作 - 我只得到整个 table 的旋转,我想使用不同的列名是 BY 组并得到结果单列。

我错过了什么?

尝试使用熔体:

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

有两种方式meltstack

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