问题描述:
众所周知,pandas生成透视表后,index会变成multiindex,即多层索引。
多层索引就是列索引大于一层的情况。
实际操作中透视表生成之后想要与其他一层索引的表格进行merge而因为出现多层索引所以无法实现正常的merge。
网上只有如何形成multiindex的方法,却没有怎么取消多层索引的方法,最多也只是消除index,然而并不能解决问题。
查阅了文档也并没有直接合并多层索引的函数存在。
所以自己想出一种可以恢复多层索引为一层的方法。
LICENCECD ORDER_DATE CIGCD SLQTY
0 1 2018-01-01 322602 200
1 1 2018-01-01 320505 200
2 1 2018-01-01 320503 200
4 1 2018-01-01 430402 800
6 2 2018-01-01 423806 200
9 2 2018-01-01 423801 1400
10 2 2018-01-01 410616 0
13 2 2018-01-01 340126 0
15 3 2018-01-01 510821 0
17 3 2018-01-01 530108 600
18 3 2018-01-01 530109 400
19 3 2018-01-01 530904 1400
20 4 2018-01-01 530907 0
22 4 2018-01-01 710119 200
data = data[index=['LICENCECD','ORDER_DATE'],values=['SLQTY'],colums=['CIGCD']]
SLQTY ...
CIGCD 320503 320505 322602 ... 530904 530907 710119
LICENCECD ORDER_DATE ...
1 2018-01-01 200.0 200.0 200.0 ... NaN NaN NaN
2 2018-01-01 NaN NaN NaN ... NaN NaN NaN
3 2018-01-01 NaN NaN NaN ... 1400.0 NaN NaN
4 2018-01-01 NaN NaN NaN ... NaN 0.0 200.0
如上,有两级标题外加一层index
LICENCECD ORDER_DATE SLQTY ...
CIGCD 320503 320505 ... 530109 530904 530907 710119
0 1 2018-01-01 200.0 200.0 ... NaN NaN NaN NaN
1 2 2018-01-01 NaN NaN ... NaN NaN NaN NaN
2 3 2018-01-01 NaN NaN ... 400.0 1400.0 NaN NaN
3 4 2018-01-01 NaN NaN ... NaN NaN 0.0 200.0
这里已经消除了index
col_li = list(data.columns.level[0])) #['SLQTY', 'ORDER_DATE', 'LICENCECD'] index和values集合,且倒序
col_li= col_li[1:] # [ 'ORDER_DATE', 'LICENCECD']
col_li.reverse() # =['LICENCECD','ORDER_DATE']
col_li0 = list(data.columns.level[1]) #得到一个列表
col_li.extend(col_li0)
data.columns=col_li
LICENCECD ORDER_DATE 320503 320505 ... 530109 530904 530907 710119
0 1 2018-01-01 200.0 200.0 ... NaN NaN NaN NaN
1 2 2018-01-01 NaN NaN ... NaN NaN NaN NaN
2 3 2018-01-01 NaN NaN ... 400.0 1400.0 NaN NaN
3 4 2018-01-01 NaN NaN ... NaN NaN 0.0 200.0
搞定!
后续修改:
data = data[index=['LICENCECD','ORDER_DATE'],values=['SLQTY'],colums=['CIGCD']]
将values和columns的中括号去掉,写成
data = data[index=['LICENCECD','ORDER_DATE'],values='SLQTY',colums='CIGCD']
或者当index只有一个列名时,使用字符串而不是列表,可以有效地避免多层索引的问题。