Pandas 數據重塑
1. 前言
上一節我們學習了 Pandas 層次化索引的概念,可以用來表示更高維度的數據集。我們前面學習的數據處理大多是在數據值層面進行操作,有時候的數據分析僅僅靠數據值的處理是完全不夠的,還要對數據的結構做處理,使其更加適合分析的需要,那 Pandas 庫又提供了怎樣的操作來實現這類需要呢?
Pandas 提供了數據重塑 / 軸向旋轉的操作來對數據進行重新排列,實現數據的結構變化,本節課我們將一起學習該操作的具體實現方式,主要涉及到 stack () ,unstack () 和 pivot () 三個操作函數。
2. 數據重塑
Pandas 對應數據的重塑有三種操作方式,分別為重塑操作 stack () , unstack () 和軸向旋轉操作 pivot ():
- stack ():該操作是將數據的列 “旋轉” 為行;
- unstack ():該操作是將數據的行 “旋轉” 為列。
下面我們先構造一些模擬數據,然后詳細講解這兩種數據重塑的方式:
# 導入 Pandas 庫
import pandas as pd
# 構造數據集
df_data=pd.DataFrame([[96,92,83,94],[85,86,77,88],[69,90,91,82]],
index=['語文','數學','英語'],
columns=['月考1','月考2','月考3','月考4'])
print(df_data)
# --- 輸出結果 ---
月考1 月考2 月考3 月考4
語文 96 92 83 94
數學 85 86 77 88
英語 69 90 91 82
# 結果解析:這就是我們前面幾節課學習的,創建一個 DataFrame 數據集的方式。
# 接下來我們為 df_data 數據集指定行索引和列索引的索引名,分別為 “科目”,“模考”,這里要注意索引名和索引值的區別,我們上面的 index 和 columns 參數指定的是行索引和列索引值。
df_data.index.name='科目'
df_data.columns.name='模考'
print(df_data)
# --- 輸出結果 ---
??? 月考1 月考2 月考3 月考4
科目
語文 96 92 83 94
數學 85 86 77 88
英語 69 90 91 82
# 結果解析:這里可以看到 df_data 數據集中有了行索引名“科目”和列索引名“模考”。
1. stack() 函數
通過該函數,我們將 df_data 數據集的數據列轉為數據行:
# df_data 為上述構建的數據集
print(df_data.stack())
# --- 輸出結果 ---
科目 ???
語文 月考1 96
月考2 92
月考3 83
月考4 94
數學 月考1 85
月考2 86
月考3 77
月考4 88
英語 月考1 69
月考2 90
月考3 91
月考4 82
結果解析:通過列旋轉為行的重塑方式,我們看月考列數據變為了行數據,得到數據集有了層次化的列索引,一維的 “科目”,二維的 “模考”,這樣的數據結構對于我們分析每科在各次月考中成績的變化有很好的幫助。
2. unstack() 函數
通過該函數,我們將 df_data 數據集的數據行轉為數據列:
# df_data 為上述構建的數據集
print(df_data.unstack())
# --- 輸出結果 ---
模考 科目
月考1 語文 96
數學 85
英語 69
月考2 語文 92
數學 86
英語 90
月考3 語文 83
數學 77
英語 91
月考4 語文 94
數學 88
英語 82
結果解析:這里可以看到,原數據中的科目行數據,變為了列數據,索引也是層次化的索引,對于我們分析每次月考各科目成績的波動有很好的幫助。
如果我們對 stack () 操作后返回的數據集,再進行 unstack () 操作,會發現回到了原數據結構,說明 unstack () 是 stack () 的逆操作:
print(df_data.stack().unstack())
# --- 輸出結果 ---
??? 月考1 月考2 月考3 月考4
科目
語文 96 92 83 94
數學 85 86 77 88
英語 69 90 91 82
3. pivot() 函數
該函數用于指定行索引,列索引,以及數據值,生成一個 “pivot” 數據表格。該函數有三個參數:
參數名 | 說明 |
---|---|
index | 新數據集的列索引 |
columns | 新數據集的行索引 |
values | 對應行和列所要填充的數據值,如果沒有,填充 NaN |
下面我們先模擬一個 DataFrame 數據集,便于該函數的操作效果展示:
# 這里模擬了3年某位學生各學期語文、數學得分的數據表。
df_data_pivot=pd.DataFrame([["2018","上學期",83,94],["2018","下學期",77,88],
["2019","上學期",83,94],["2019","下學期",83,94],
["2020","上學期",83,94],["2020","下學期",91,82]],
index=['a','b','c','d','e','f'],
columns=['年度','學期','語文','數學'])
print(df_data_pivot)
# --- 輸出結果 ---
年度 學期 語文 數學
a 2018 上學期 83 94
b 2018 下學期 77 88
c 2019 上學期 83 94
d 2019 下學期 83 94
e 2020 上學期 83 94
f 2020 下學期 91 82
接下來我們將通過函數 pivot () 指定行索引、列索引以及數據值,生成新的數據集:
# pivot(index="年度", columns="學期", values="語文")
new_df=df_data_pivot.pivot(index="年度", columns="學期", values="語文")
print(new_df)
# --- 輸出結果 ---
學期 上學期 下學期
年度
2018 83 77
2019 83 83
2020 83 91
輸出解析:我們這里指定行索引為年度,列索引為學期,填充對應行和列索引的語文數據值,通過輸出結果可以看到新的數據集,這樣處理之后的數據結構是很利于我們分析各年度各學期語文成績的一個變化情況。
3. 小結
本節課程我們主要學習了 Pandas 庫對于數據的重塑操作,該操作能有效的滿足我們對原數據的數據結構的變換操作,進而滿足我們對數據不同的分析需要。本節課程的重點如下:
- stack () 函數和 unstack () 函數的具體操作方法,以及他們之間的區別;
- pivot () 函數的使用條件和操作方法。