为了账号安全,请及时绑定邮箱和手机立即绑定

如何设置和分组熊猫多级列?

如何设置和分组熊猫多级列?

回首忆惘然 2021-10-10 16:14:35
我有一个形状像这样的数据框:   PX_LAST PX_OPEN PX_CLOSE ticker source timestamp0        1       2        3      A   LSE   201801011        4       5        6      A   LSE   201801021        7       8        9      B   LSE   201801011       10      11       12      B   LSE   20180102....我想将其按摩为以下格式:                                     A                          B                                   LSE                        LSE            PX_LAST, PX_CLOSE, PX_OPEN PX_LAST, PX_CLOSE, PX_OPENtimestamp 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)它非常冗长,我们需要执行所有交换级别调用才能使列成为正确的形状。2)它似乎没有按照我希望的方式进行分组,即我得到的结果是这样的:              LSE     LSE      LSE      LSE ...          PX_LAST PX_LAST PX_CLOSE PX_CLOSE ...timestamp 20180101       1        7        2       8  ...20180102       4        8        5      11  ...有没有更简洁的方法来做到这一点,这样我就可以获得我想要的格式?
查看完整描述

3 回答

?
临摹微笑

TA贡献1982条经验 获得超2个赞

一种选择是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


查看完整回答
反对 回复 2021-10-10
?
蓝山帝景

TA贡献1843条经验 获得超7个赞

您的解决方案应该稍作更改 - 中的列顺序set_index,省略第二个swaplevel并添加sort_index:


df = (df.set_index(['timestamp', 'source', 'ticker'])

        .unstack(level=[1,2])

        .swaplevel(0,2,axis=1)

        .sort_index(axis=1)

)

print (df)

ticker           A                        B                

source         LSE                      LSE                

          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


查看完整回答
反对 回复 2021-10-10
?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

我的提议是通过以下方式更改您的解决方案:


第 1 步:df.set_index(['timestamp', 'ticker', 'source']).unstack([1, 2]),就像您所做的那样。


它将列保留为以下形状:


          PX_LAST     PX_OPEN     PX_CLOSE

ticker          A   B       A   B        A   B

source        LSE LSE     LSE LSE      LSE LSE

(并timestamp作为索引)。


第 2 步:reorder_levels([1, 2, 0], axis=1),而不是您的 2 条 swaplevel说明。


它将列保留为:


ticker          A       B       A       B        A        B

source        LSE     LSE     LSE     LSE      LSE      LSE

          PX_LAST PX_LAST PX_OPEN PX_OPEN PX_CLOSE PX_CLOSE

最后一步是 sort_index(axis=1, level=[0,1], sort_remaining=False)


请注意,您只对级别 0 和 1 进行排序,因此最后级别的顺序保持不变(PX_LAST、PX_OPEN、PX_CLOSE)。


所以整个脚本(即一条指令)是:


df2 = df.set_index(['timestamp', 'ticker', 'source']).unstack([1, 2])\

    .reorder_levels([1, 2, 0], axis=1)\

    .sort_index(axis=1, level=[0,1], sort_remaining=False)

当你打印结果时,你会得到:


ticker          A                        B

source        LSE                      LSE

          PX_LAST PX_OPEN PX_CLOSE PX_LAST PX_OPEN PX_CLOSE

timestamp

20180101        1       2        3       7       8        9

20180102        4       5        6      10      11       12


查看完整回答
反对 回复 2021-10-10
  • 3 回答
  • 0 关注
  • 201 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信