我有一个数据帧的形状是这样的:
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
....
我想把它按摩成以下格式:
^{pr2}$我首先尝试使用set_index
将ticker和source列设置为行索引,然后使用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 ...
有没有一种更干净的方法来实现我想要的格式?在
您的解决方案应该有一点改变-使用
set_index
中列的顺序,省略第二个swaplevel
并添加{a1}:一个选项是
melt
、set_index
和unstack
:或
^{pr2}$melt
,和pivot_table
:我的建议是通过以下方式改变您的解决方案:
第一步:
df.set_index(['timestamp', 'ticker', 'source']).unstack([1, 2])
, 就像你一样。在它将列保留为以下形状:
(和
timestamp
作为索引)。在第二步:
reorder_levels([1, 2, 0], axis=1)
,而不是你的2swaplevel
指令。在它将列保留为:
^{pr2}$最后一步是
sort_index(axis=1, level=[0,1], sort_remaining=False)
请注意,您只对级别0和1进行排序,因此最后一个级别的顺序是 保持不变(PX_LAST,PX_OPEN,PX_CLOSE)。在
所以整个脚本(即单个指令)是:
打印结果时,您将得到:
^{4}$相关问题 更多 >
编程相关推荐