Python--pandas--unstack() 与stack()

概述

  • Python的pandas库是我们经常用到的库之一,不可避免地会应用到数据的reshape。其中,stack和unstack是我们经常用到的操作之一。很多人对这2个操作比较迷惑。

  • stack和unstack是python进行层次化索引的重要操作。层次化索引就是对索引进行层次化分类,便于使用,这里的索引可以是行索引,也可以是列索引。

  • 常见的数据的层次化结构有两种,一种是表格,一种是“花括号”,即下面这样的两种形式:


    表格格式

    花括号格式.png
  • 表格在行列方向上均有索引,花括号结构只有“列方向”上的索引。

  • 其实,应用stack和unstack只需要记住下面的知识点即可:

    • stack: 将数据从”表格结构“变成”花括号结构“,即将其列索引变成行索引。
    • unstack: 数据从”花括号结构“变成”表格结构“,即要将其中一层的行索引变成列索引。如果是多层索引,则以上函数是针对内层索引(这里是store)。利用level可以选择具体哪层索引。

入门级demo

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Time    : 2019-06-12 23:48
# @Author  : LiYahui
# @Description :  stack demo
import pandas as pd
import numpy as np
from pandas import Series,DataFrame
data=DataFrame(np.arange(12).reshape((3,4)),index=pd.Index(['street1','street2','street3']),
               columns=pd.Index(['store1','store2','store3','store4']))
print('----------data--------')
print(data)
print('-------------data2----------------------------\n')
data2=data.stack()
data3=data2.unstack()
print(data2)
print('--------------data3---------------------------\n')
print(data3)

data4=data2.unstack(level=0)
print('-------data4----------')
print(data4)
data5=data2.unstack(level=-1) # 默认的level=-1,内层的索引
print('------data5--------')
print(data5)
'''
----------data--------
         store1  store2  store3  store4
street1       0       1       2       3
street2       4       5       6       7
street3       8       9      10      11
-------------data2----------------------------

street1  store1     0
         store2     1
         store3     2
         store4     3
street2  store1     4
         store2     5
         store3     6
         store4     7
street3  store1     8
         store2     9
         store3    10
         store4    11
dtype: int64
--------------data3---------------------------

         store1  store2  store3  store4
street1       0       1       2       3
street2       4       5       6       7
street3       8       9      10      11
-------data4----------
        street1  street2  street3
store1        0        4        8
store2        1        5        9
store3        2        6       10
store4        3        7       11
------data5--------
         store1  store2  store3  store4
street1       0       1       2       3
street2       4       5       6       7
street3       8       9      10      11
'''
  • 可以看到:使用stack函数,将data的列索引['store1','store2','store3’,'store4']转变成行索引(第二层),便得到了一个层次化的Series(data2),使用unstack函数,将data2的第二层行索引转变成列索引(默认内层索引,level=-1),便又得到了DataFrame(data3)
  • 下面的例子我们利用level选择具体哪层索引。

data4=data2.unstack(level=0)
print(data4)
'''
        street1  street2  street3
store1        0        4        8
store2        1        5        9
store3        2        6       10
store4        3        7       11
'''
  • 我们可以清晰看到,当我们取level=0时,即最外层索引时,unstack把行索引['street1','street2','street3’]变为了列索引。

  • 推荐学习博客:https://blog.csdn.net/anshuai_aw1/article/details/82830916

你可能感兴趣的:(Python--pandas--unstack() 与stack())