手动反爬虫: 原博地址
知识梳理不易,请尊重劳动成果,文章仅发布在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)]
至此,两个问题就梳理完毕了