一、概述
pandas是一個流行的數據處理庫,而unstack是pandas中一個很常見的操作,它可以將pivot後的表再次變換成我們需要的格式,比如將二維的DataFrame轉變為三維的Panel。在數據分析中,我們通常需要將數據進行一些重塑操作,以便更好地進行數據分析和建模。
二、unstack操作的基礎用法
unstack的基礎用法就是將多層的層次化索引轉換成普通的列,比如下面的代碼:
import pandas as pd import numpy as np # 創造一個多層索引的DataFrame tuples = list(zip(*[['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'], ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']])) index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second']) df = pd.DataFrame(np.random.randn(8, 2), index=index, columns=['A', 'B']) # 對DataFrame進行unstack操作 df_unstacked = df.unstack() print(df_unstacked)
它的輸出結果如下:
A B one two one two bar -0.782904 -0.328571 -1.247849 -1.016532 baz -0.641387 -0.404023 -0.111008 -0.150736 foo 0.102076 0.443202 0.056593 0.596241 qux 0.534712 0.851135 -0.667280 -1.622218
可以看到,原來有兩層索引的DataFrame被轉換為了普通的二維表格,其中第一層索引成為了列的第一級,第二層索引成為了列的第二級。
三、unstack的高級用法
除了基礎用法外,unstack還有很多高級的用法。比如,它可以指定轉換後列的層級,以及轉換後的數據類型等,下面將介紹一些常用的高級操作。
1. 指定unstack的級別
unstack默認會將最後一級索引轉換為列,如果你不想將最後一級索引轉換為列,可以指定轉換某一級別的索引為列,例如下面的代碼:
# 創造一個三層索引的DataFrame index = pd.MultiIndex.from_tuples([('one', 'A', 'X'), ('one', 'B', 'Y'), ('two', 'C', 'Z'), ('two', 'D', 'W')], names=['first', 'second', 'third']) df = pd.DataFrame(np.random.randn(4, 2), index=index, columns=['A', 'B']) # 對DataFrame進行unstack操作 df_unstacked = df.unstack(level=1) print(df_unstacked)
這裡我們將第二層索引轉換為列,輸出結果如下:
A B second A B A B first third one X -1.029280 -0.331370 -1.369678 -0.758891 Y 0.339987 0.696008 0.366717 3.316752 two W 2.128560 0.111243 -0.798346 1.273068 Z 1.162062 0.452590 -0.496570 -0.357904
我們可以看到,最終的結果中A和B對應的列被多了一個層級,這是因為我們指定了第二級索引轉換為列。
2. 轉換後的列重命名
unstack轉換後的結果會默認使用多級列進行命名,但有時候我們需要自己定義列名,此時可以使用rename方法進行重命名,比如下面的代碼:
# 創造一個三層索引的DataFrame index = pd.MultiIndex.from_tuples([('one', 'A', 'X'), ('one', 'B', 'Y'), ('two', 'C', 'Z'), ('two', 'D', 'W')], names=['first', 'second', 'third']) df = pd.DataFrame(np.random.randn(4, 2), index=index, columns=['A', 'B']) # 對DataFrame進行unstack和列重命名操作 df_unstacked = df.unstack(level=1) df_unstacked = df_unstacked.rename(columns={"A": "First", "B": "Second"}) print(df_unstacked)
這裡我們將列A和B分別改名為First和Second,輸出結果如下:
First Second second A B A B first third one X -1.270645 -0.995538 -1.875756 -1.005831 Y 0.182613 1.739008 0.246412 -0.777170 two W -0.731322 -0.744116 -0.492626 -1.574007 Z 2.008461 -0.777942 -0.927567 -0.143443
3. 轉換後數據類型的處理
在進行unstack操作後,由於新生成的列分層級命名,其數據類型可能會有變化,這時我們需要進行數據類型轉換,比如下面的代碼:
# 創造一個使用了Int32Dtype的三層索引的DataFrame index = pd.MultiIndex.from_tuples([('one', 'A', 'X'), ('one', 'B', 'Y'), ('two', 'C', 'Z'), ('two', 'D', 'W')], names=['first', 'second', 'third']) df = pd.DataFrame({'A': pd.Series([1, 2, 3], dtype=pd.Int32Dtype()), 'B': pd.Series([4, 5, 6], dtype=pd.Int32Dtype()),}, index=index) # 對DataFrame進行unstack操作 df_unstacked = df.unstack(level=1) df_unstacked = df_unstacked.astype(float) print(df_unstacked)
這裡我們將之前int32類型的列轉換為float類型,輸出結果如下:
A B second A B A B first third one X 1.000000 4.000000 2.000000 5.000000 Y 0.0 0.000000 0.000000 0.000000 two W 0.0 0.000000 0.000000 0.000000 Z 0.0 0.000000 0.000000 0.000000
四、unstack和pivot_table的比較
除了unstack操作,pandas還提供了另一個操作用於數據重塑,叫做pivot_table。二者有些相似之處,也有些不同。
1. 相似之處
在使用上,二者很相似,都是將數據透視成我們需要的形式,並且都需要指定需要透視的列和統計量。
2. 不同之處
二者的不同之處在於操作的對象不同。pivot_table是對DataFrame進行操作,而unstack是對Series或者DataFrame進行操作,並且unstack操作的結果可能會包含nan值,而pivot_table不會。
五、總結
在數據處理中,不同的數據形式可能需要不同的分析和處理方式。pandas的unstack操作提供了一種簡單的數據重塑方式,可以將多層索引的DataFrame重塑成我們需要的形式。同時,pandas還提供了很多高級的用法,比如指定操作層級、重命名列以及數據類型轉換等。與pivot_table不同,unstack可以對Series和DataFrame進行操作,並且比較靈活,但也需要注意到可能會出現nan值的情況。
原創文章,作者:XDCQJ,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/368705.html