说明

两种数据结构,一种表格“行列都有index”, 一种花括号“只有列有index”

store1 store2 store3
street1 1 2 3
street2 4 5 6

table_struck.png

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

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

    例子

    1. import numpy as np
    2. import pandas as pd
    3. from pandas import Series,DataFrame
    4. data=DataFrame(np.arange(12).reshape((3,4)),index=pd.Index(['street1','street2','street3']),
    5. columns=pd.Index(['store1','store2','store3','store4']))
    6. print(data)
    7. print('-----------------------------------------\n')
    8. data2=data.stack()
    9. data3=data2.unstack()
    10. print(data2)
    11. print('-----------------------------------------\n')
    12. print(data3)
    输出结果为 ```
    1. store1 store2 store3 store4
    street1 0 1 2 3 street2 4 5 6 7 street3 8 9 10 11

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: int32

  1. store1 store2 store3 store4

street1 0 1 2 3 street2 4 5 6 7 street3 8 9 10 11

  1. 结论:使用stack函数,将data的列索引['store1','store2','store3’,'store4']转变成行索引(第二层),便得到了一个层次化的Series(data2),使用unstack函数,将data2的第二层行索引转变成列索引(默认内层索引,level=-1),便又得到了DataFrame(data3)。
  2. <a name="x5kGV"></a>
  3. ## 应用
  4. <a name="Fr2hb"></a>
  5. #### 行列互换
  6. 还是刚刚的数据data
  1. store1 store2 store3 store4

street1 0 1 2 3 street2 4 5 6 7 street3 8 9 10 11

  1. 通过stack将“表格数据”转换为“花括号数据”,即只有列方向索引

data2 = data.stack()

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: int32

  1. unstack重新堆叠数据,将原行索引(level=0)做为level

data2.unstack(level=0)

  1. street1 street2 street3

store1 0 4 8 store2 1 5 9 store3 2 6 10 store4 3 7 11 ```