公衆號:尤而小屋
作者:Peter
編輯:Peter
大家好,我是Peter~
今天帶來的文章是圖解Pandas中的兩個重要的函數:stack和unstack。
stack和unstack是針對pandas的軸進行重新排列的兩個方法,二者互爲逆操作:
- stack: 將數據的列columns轉旋轉成行index
- unstack:將數據的行index旋轉成列columns
- 二者默認操作的都是最內層
Pandas連載文章
本文是Pandas更新的第16篇文章,歡迎訪問閱讀:
下面通過詳細的例子來進行講解二者的用法,同時奉上:官網學習地址
stack
stack函數的主要作用是將原來的列轉成最內層的行索引,轉換之後都是多層次索引。官方原文:
Stack the prescribed level(s) from columns to index.
使用方法爲:
pd.stack(level=-1, dropna=True)
- level表示的是轉換的是最內層(倒數第一級)
- dropna表示的是對缺失值的處理
通過官網的一幅圖來解釋下:列屬性AB變成了行索引AB
對單層DataFrame進行stack操作
import pandas as pd
import numpy as np
看下默認的情況:
我們發現df2的索引index也變成了多層次索引:
還有一個特點:當我們對單層的DataFrame進行stack操作之後,會變成Series型數據:
對多層DataFrame進行stack操作
首先我們生成一個多層次的列數型
模擬出一份多層次列屬性的數據:
看下模擬數據df3的相關信息:
type(df3)
pandas.core.frame.DataFrame
df3.index
Index(['小明', '小紅'], dtype='object')
df3.columns
MultiIndex([('information', 'sex'),
('information', 'weight')],)
看下stack之後的數據:
二者比較
對比下原數據和生成的新數據:
1、索引index比較
2、列屬性比較
3、數據類型比較
參數level
level控制的是一個或者多個屬性進行堆疊;可以使用數字索引或者名稱索引。
模擬一份多層次的列屬性數據:
multicol2 = pd.MultiIndex.from_tuples([('weight', 'kg'), # 多層次列屬性
('height', 'm')],
name=["col","unit"])
data1 = pd.DataFrame([[1.0, 2.0], [3.0, 4.0]],
index=['cat', 'dog'],
columns=multicol2
)
data1
我們可以可以看到data1的列屬性是多層次的:
data1.columns
# 結果
MultiIndex([('weight', 'kg'),
('height', 'm')],
names=['col', 'unit'])
我們還可以使用列數的名稱進行stack操作:
對於另一個"col"也是相同的操作:
還可以同時對多個進行操作,指定名稱或者索引號:
參數dropna
如果原數據中存在缺失值,我們該如何處理?模擬一份存在缺失值的數據:
data2 = pd.DataFrame([[None, 2.0], # 引入一個缺失值
[4.0, 6.0]],
index=['cat', 'dog'],
columns=multicol2)
data2
默認是是True,會刪除同時爲缺失值的情況:
如果我們改成False,會保留同時爲NaN的數據:
unstack
將最內層的行索引變成列:就是行索引AB變成了列屬性AB
使用方法
unstack是stack的逆操作,將最內層的行索引變成列
unstack(level=- 1, fill_value=None)
- level:進行操作的索引層級,可以是名稱
- fill_value:當我們進行操作的時候,如果產生了缺失值,可以用指定的值填充
參數level
來自官網的兩張圖,在不同的索引號進行unstack操作的結果對比,默認是unstack(1):
我們使用之前的一份生成的數據,接下來我們對df5進行操作。
1、使用unstack的默認操作:默認是對最裏層操作
2、我們改成索引爲0的行,同時我們也可以使用行的名稱作爲參數的值
參數fill_value
該參數的作用是當我們使用unstack進行操作的時候,產生的缺失值用指定數據填充。
我們使用之前的df6數據框來進行操作:
使用unstack的默認情況:會產生兩個空值
對產生的缺失值進行填充:
- 默認情況的使用
- 使用名稱
- 使用索引號
總結
stack和unstack主要是對Series或者DataFrame型數據進行堆疊和取消堆疊的操作,它們有個共同的特點就是:默認都是對最裏層的索引號進行操作,二者互爲逆操作,區別在於:stack是列轉行,unstack是行轉列。