pandas.Dataframe經過pivot_table生成透視表以後multiindex的處理
問題描述:
衆所周知,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
第三部:reset_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只有一個列名時,使用字符串而不是列表,可以有效地避免多層索引的問題。