pandas层次性索引MultiIndex变化操作

pandas层次性索引MultiIndex变化操作


手动反爬虫: 原博地址

 知识梳理不易,请尊重劳动成果,文章仅发布在CSDN网站上,在其他网站看到该博文均属于未经作者授权的恶意爬取信息

如若转载,请标明出处,谢谢!

需求背景

1、有没有方法可以向如图”平仓订单数“的下级插入2个占比字段?即跟”平仓订单数“下的亏损、盈利字段同级别
在这里插入图片描述
2、有没办法把列的级别调整为如图所示表格?
在这里插入图片描述

问题求解

由于没有真实的数据,这里就是使用0-15共16个数据创建四行四列的数据,创建的数据结果如下

import pandas as pd
import numpy as np

frame = pd.DataFrame(np.arange(16).reshape((4, 4)),
                      index=[['A50', 'A50', 'B50', 'B50'], ['买入', '卖出', '买入', '卖出']],
                      columns=[['平仓订单数', '平仓订单数', '平仓手数','平仓手数'],
                               ['亏损', '盈利', '亏损', '盈利']])

frame.index.names = ['股票代码','操作']
frame.columns.names = ['平仓情况','盈亏情况']
frame

输出结果为:
在这里插入图片描述
首先解决第一个问题,将计算的亏损和盈利订单占比插到二级列索引中,这一步就是比较简单,进行列索引的查看,然后根据对应字段运算后赋值到指定字段下

frame.columns

frame[('平仓订单数', '亏损占比')] = frame[('平仓订单数', '亏损')] /(frame[('平仓订单数', '亏损')] + frame[('平仓订单数', '盈利')])
frame

frame[('平仓手数', '亏损占比')] = frame[('平仓手数', '亏损')] /(frame[('平仓手数', '亏损')] + frame[('平仓手数', '盈利')])
frame

输出结果为:
在这里插入图片描述
这时候就发现一个问题,目的是达到了,但是还希望相同的一级列索引可以合并,根据pandas的机制,如果分层级索引的值相同,会自动合并,那么直接将相同的列索引放在一起就可以了,那么这里只要把('平仓订单数', '亏损占比')这个列索引调整到第3列的位置,那么最后就完成了

cols = list(frame)
cols.insert(2, cols.pop(cols.index(('平仓订单数', '亏损占比'))))
cols

frame = frame.loc[:, cols]
frame

输出结果为:
在这里插入图片描述
至此第一个问题就解决了,接下来就是第二个问题,相当于是进行一级列索引与二级列索引的交换,这里有两种方式,第一种是复杂点的,之前分别用两个单独的方法较多,这里第一反应就是将两者组合了

frame = frame.swapaxes(0,1).swaplevel(0,1).T
frame

frame.reorder_levels(order = [0,1],axis =1)

输出结果为:
在这里插入图片描述

第二种方式就是直接使用reorder_levels方法,返回的结果和上面的一样
在这里插入图片描述
可以发现两者的操作后,还是存在一个一级列索引自动合并的问题,也可以使用之前一列列数据进行insert的方式,之前是只用操作一列就可以,但是这里需要操作三列,如果是更多的列就不能总是依仗手动insert方法,需要找到对应的方法将索引排序,然后按照排序后的索引进行调换数值就可以满足要求了,于是就用到了sortlevel()方法

frame1 = frame.copy()
frame1.columns

# 前面直接使用insert插入后自动合并排序,如果数据过多的话就不方便了,这里直接使用sortlevel排序
columns = frame1.columns.sortlevel()[0]
columns

frame1.loc[:,list(columns)]

在这里插入图片描述

至此,两个问题就梳理完毕了

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lys_828

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值