我有一个形状如下的数据框:
PX_LAST PX_OPEN PX_CLOSE ticker source timestamp
0 1 2 3 A LSE 20180101
1 4 5 6 A LSE 20180102
1 7 8 9 B LSE 20180101
1 10 11 12 B LSE 20180102
....
我想将其按摩为以下格式:
A B
LSE LSE
PX_LAST, PX_CLOSE, PX_OPEN PX_LAST, PX_CLOSE, PX_OPEN
timestamp
20180101 1 2 3 7 8 9
20180102 4 5 6 10 11 12
....
我试图首先使用set_index
将行情收录器和源列设置为行索引,并使用unstack
它们将其推入列轴,这似乎确实起作用
df.set_index(['timestamp', 'ticker', 'source'])
.unstack(level=[1,2])
.swaplevel(0,1,axis=1)
.swaplevel(1,2,axis=1)
这可以解决问题,但有两个问题:1)非常冗长,我们需要做所有的swaplevel调用才能使列成为正确的形状。2)似乎并没有按照我希望的方式进行分组,即我得到的结果是这样的:
LSE LSE LSE LSE ...
PX_LAST PX_LAST PX_CLOSE PX_CLOSE ...
timestamp
20180101 1 7 2 8 ...
20180102 4 8 5 11 ...
有没有更清洁的方法可以执行此操作,以便获得所需的格式?
一种选择是melt
,set_index
和unstack
:
u = df.melt(['ticker', 'source', 'timestamp'])
(u.set_index(u.columns.difference({'value'}).tolist())['value']
.unstack([1, 0, -1])
.sort_index(axis=1))
ticker A B
source LSE LSE
variable PX_CLOSE PX_LAST PX_OPEN PX_CLOSE PX_LAST PX_OPEN
timestamp
20180101 3 1 2 9 7 8
20180102 6 4 5 12 10 11
或melt
,和pivot_table
:
u = df.melt(['ticker', 'source', 'timestamp'])
u.pivot_table(index='timestamp',
columns=['ticker','source','variable'],
values='value')
ticker A B
source LSE LSE
variable PX_CLOSE PX_LAST PX_OPEN PX_CLOSE PX_LAST PX_OPEN
timestamp
20180101 3 1 2 9 7 8
20180102 6 4 5 12 10 11
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句