说明
两种数据结构,一种表格“行列都有index”, 一种花括号“只有列有index”
store1 | store2 | store3 | |
---|---|---|---|
street1 | 1 | 2 | 3 |
street2 | 4 | 5 | 6 |
其实,应用stack和unstack只需要记住下面的知识点即可:
- stack: 将数据从”表格结构“变成”花括号结构“,即将其列索引变成行索引。
- unstack: 数据从”花括号结构“变成”表格结构“,即要将其中一层的行索引变成列索引。如果是多层索引,则以上函数是针对内层索引(这里是store)。利用level可以选择具体哪层索引。
例子
输出结果为 ```import numpy as np
import pandas as pd
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('-----------------------------------------\n')
data2=data.stack()
data3=data2.unstack()
print(data2)
print('-----------------------------------------\n')
print(data3)
street1 0 1 2 3 street2 4 5 6 7 street3 8 9 10 11store1 store2 store3 store4
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
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)。
<a name="x5kGV"></a>
## 应用
<a name="Fr2hb"></a>
#### 行列互换
还是刚刚的数据data
store1 store2 store3 store4
street1 0 1 2 3 street2 4 5 6 7 street3 8 9 10 11
通过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
unstack重新堆叠数据,将原行索引(level=0)做为level
data2.unstack(level=0)
street1 street2 street3
store1 0 4 8 store2 1 5 9 store3 2 6 10 store4 3 7 11 ```