pandas.Dataframe生成pivot_table後多層索引變一層索引

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只有一個列名時,使用字符串而不是列表,可以有效地避免多層索引的問題。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章