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只有一个列名时,使用字符串而不是列表,可以有效地避免多层索引的问题。 

你可能感兴趣的:(pandas)