概述
Python的pandas庫是我們經(jīng)常用到的庫之一昆咽,不可避免地會(huì)應(yīng)用到數(shù)據(jù)的reshape。其中蓖捶,stack和unstack是我們經(jīng)常用到的操作之一剑逃。很多人對這2個(gè)操作比較迷惑。
stack和unstack是python進(jìn)行層次化索引的重要操作稍坯。層次化索引就是對索引進(jìn)行層次化分類酬荞,便于使用,這里的索引可以是行索引瞧哟,也可以是列索引混巧。
-
常見的數(shù)據(jù)的層次化結(jié)構(gòu)有兩種,一種是表格勤揩,一種是“花括號(hào)”咧党,即下面這樣的兩種形式:
表格在行列方向上均有索引,花括號(hào)結(jié)構(gòu)只有“列方向”上的索引陨亡。
-
其實(shí)傍衡,應(yīng)用stack和unstack只需要記住下面的知識(shí)點(diǎn)即可:
- stack: 將數(shù)據(jù)從”表格結(jié)構(gòu)“變成”花括號(hào)結(jié)構(gòu)“,即將其列索引變成行索引负蠕。
- unstack: 數(shù)據(jù)從”花括號(hào)結(jié)構(gòu)“變成”表格結(jié)構(gòu)“蛙埂,即要將其中一層的行索引變成列索引。如果是多層索引遮糖,則以上函數(shù)是針對內(nèi)層索引(這里是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) # 默認(rèn)的level=-1止吁,內(nèi)層的索引
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函數(shù)被辑,將data的列索引['store1','store2','store3’,'store4']轉(zhuǎn)變成行索引(第二層),便得到了一個(gè)層次化的Series(data2)敬惦,使用unstack函數(shù)盼理,將data2的第二層行索引轉(zhuǎn)變成列索引(默認(rèn)內(nèi)層索引,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
'''
- 我們可以清晰看到奏路,當(dāng)我們?nèi)evel=0時(shí),即最外層索引時(shí)臊诊,unstack把行索引['street1','street2','street3’]變?yōu)榱肆兴饕?/li>
- 推薦學(xué)習(xí)博客:https://blog.csdn.net/anshuai_aw1/article/details/82830916