使用 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
有两种方式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
我在 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
有两种方式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