圖解Pandas的軸旋轉函數:stack和unstack

公衆號:尤而小屋
作者: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是行轉列。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章