Pandas 提供了多元的資料重塑方法,靈活應對不同資料格式的轉換需求。stack
和 melt
方法能有效地將寬格式資料轉換為長格式,適用於單一索引或多層索引的資料結構。wide_to_long
則更專注於處理特定格式的寬格式資料,例如時間序列資料。這些方法都能透過引數設定,精確控制資料轉換的過程。
import pandas as pd
# 建立範例資料
data = {
"state": ["Texas", "Arizona", "Florida"],
"apple": [12, 9, 0],
"orange": [10, 7, 14],
"banana": [40, 12, 190]
}
df = pd.DataFrame(data)
# 使用 stack 方法進行轉換
df_long = df.set_index("state").stack().reset_index()
df_long = df_long.rename(columns={"level_1": "fruit", 0: "number_grown"})
print(df_long)
資料重塑技術:從寬格式轉換為長格式
在資料分析和處理過程中,經常需要將資料從寬格式(wide format)轉換為長格式(long format),或反之亦然。pandas 函式庫提供了多種方法來實作這種轉換,包括 pd.DataFrame.stack
、pd.DataFrame.melt
和 pd.wide_to_long
。本章節將深入探討這些方法的應用和技巧。
使用 pd.DataFrame.stack
進行資料重塑
pd.DataFrame.stack
是一種將寬格式資料轉換為長格式的有效方法。首先,我們需要將資料的索引設定為特定的欄位,然後使用 stack
方法進行轉換。
import pandas as pd
# 建立範例資料
data = {
"state": ["Texas", "Arizona", "Florida"],
"apple": [12, 9, 0],
"orange": [10, 7, 14],
"banana": [40, 12, 190]
}
df = pd.DataFrame(data)
# 使用 stack 方法進行轉換
df_long = df.set_index("state").stack().reset_index()
df_long = df_long.rename(columns={"level_1": "fruit", 0: "number_grown"})
print(df_long)
程式碼解析:
- 首先,我們建立了一個包含州名和水果數量的 DataFrame。
- 使用
set_index("state")
將 “state” 欄位設為索引。 stack()
方法將 DataFrame 從寬格式轉換為長格式。reset_index()
用於重置索引,將原來的索引欄位轉換為普通的欄位。- 最後,使用
rename
方法重新命名欄位,使其更具可讀性。
使用 pd.DataFrame.melt
進行資料重塑
pd.DataFrame.melt
是另一種將寬格式資料轉換為長格式的方法,它提供了更大的彈性。
# 使用 melt 方法進行轉換
df_long = df.melt(id_vars=["state"], var_name="fruit", value_name="number_grown")
print(df_long)
程式碼解析:
id_vars=["state"]
指定 “state” 欄位保持不變。var_name="fruit"
將原來的欄位名稱(apple、orange、banana)重新命名為 “fruit”。value_name="number_grown"
將對應的值重新命名為 “number_grown”。
使用 pd.wide_to_long
進行資料重塑
pd.wide_to_long
函式可以用於特定格式的寬格式資料轉換。
# 建立範例資料
data = {
"widget": ["Widget1", "Widget2"],
"quarter_1": [1, 16],
"quarter_2": [2, 32],
"quarter_3": [4, 64],
"quarter_4": [8, 128]
}
df = pd.DataFrame(data)
# 使用 wide_to_long 方法進行轉換
df_long = pd.wide_to_long(df, stubnames='quarter_', i=['widget'], j='quarter').reset_index()
df_long = df_long.rename(columns={"quarter_": "quantity"})
print(df_long)
程式碼解析:
stubnames='quarter_'
指定了欄位名稱的字首。i=['widget']
指定 “widget” 欄位保持不變。j='quarter'
將提取的數字部分命名為 “quarter”。
從長格式轉換為寬格式
要將資料從長格式轉換為寬格式,可以使用 pd.DataFrame.pivot
或 pd.pivot_table
方法。
# 建立範例資料
data = {
"state": ["Texas", "Arizona", "Florida", "Texas", "Arizona", "Florida", "Texas", "Arizona", "Florida"],
"fruit": ["apple", "apple", "apple", "orange", "orange", "orange", "banana", "banana", "banana"],
"number_grown": [12, 9, 0, 10, 7, 14, 40, 12, 190]
}
df = pd.DataFrame(data)
# 使用 pivot 方法進行轉換
df_wide = df.pivot(index="state", columns="fruit", values="number_grown").reset_index()
print(df_wide)
程式碼解析:
index="state"
指定 “state” 欄位作為索引。columns="fruit"
將 “fruit” 欄位的值轉換為新的欄位名稱。values="number_grown"
指定 “number_grown” 欄位的值作為新 DataFrame 的值。
資料重塑中的聚合運算
pd.pivot_table
提供了在資料重塑過程中進行聚合運算的功能。
# 建立範例資料
data = {
"state": ["Texas", "Arizona", "Florida", "Texas", "Arizona", "Florida", "Texas", "Arizona", "Florida"],
"fruit": ["apple", "apple", "apple", "orange", "orange", "orange", "banana", "banana", "banana"],
"number_grown": [12, 9, 0, 10, 7, 14, 40, 12, 190],
"number_eaten": [8, 10, 6, 4, 2, 3, 28, 17, 150]
}
df = pd.DataFrame(data)
# 使用 pivot_table 方法進行轉換和聚合
df_pivot = pd.pivot_table(df, index="state", columns="fruit", values="number_grown", aggfunc="sum").reset_index()
print(df_pivot)
程式碼解析:
values="number_grown"
指定需要聚合的欄位。aggfunc="sum"
指定聚合函式為求和。
Mermaid 圖表:資料重塑流程
flowchart TD A[開始] --> B{選擇重塑方法} B -->|使用 stack| C[執行 stack 操作] B -->|使用 melt| D[執行 melt 操作] B -->|使用 wide_to_long| E[執行 wide_to_long 操作] C --> F[重置索引並重新命名欄位] D --> F E --> F F --> G[完成資料重塑]
圖表解析:
此圖表展示了資料重塑的主要流程,包括選擇合適的重塑方法(stack
、melt
或 wide_to_long
),執行相應的操作,並最終完成資料重塑。不同的路徑代表了不同的重塑方法,但最終都匯聚到重置索引和重新命名欄位的步驟,以確保輸出的資料格式正確且易於閱讀。
資料重塑:靈活運用Pandas進行資料轉換
在資料分析過程中,資料的重塑是一項至關重要的任務。Pandas提供了多種強大的工具來實作資料的重塑,其中包括pd.DataFrame.pivot
、pd.pivot_table
和pd.DataFrame.explode
等方法。本文將深入探討這些方法的應用場景和具體實作方式。
使用pd.DataFrame.pivot
進行資料重塑
pd.DataFrame.pivot
是一種用於將長格式資料轉換為寬格式資料的方法。它需要指定index
和columns
引數來決定新DataFrame的行索引和列索引。
基本用法
假設我們有一個包含水果生產和消費資料的DataFrame:
import pandas as pd
# 建立範例資料
data = [
["Texas", "apple", 12, 8],
["Arizona", "apple", 9, 10],
["Florida", "apple", 0, 6],
["Texas", "orange", 10, 4],
["Arizona", "orange", 7, 2],
["Florida", "orange", 14, 3],
["Texas", "banana", 40, 28],
["Arizona", "banana", 12, 17],
["Florida", "banana", 190, 42]
]
df = pd.DataFrame(data, columns=["state", "fruit", "number_grown", "number_eaten"])
# 使用pivot進行資料重塑
pivoted_df = df.pivot(index="state", columns="fruit")
print(pivoted_df)
輸出結果:
number_grown number_eaten
fruit apple banana orange apple banana orange
state
Arizona 9 12 7 10 17 2
Florida 0 190 14 6 42 3
Texas 12 40 10 8 28 4
內容解密
此範例展示瞭如何使用pd.DataFrame.pivot
將長格式資料轉換為寬格式。透過指定index="state"
和columns="fruit"
,我們將原始資料按照州別和水果種類別進行了重塑。結果DataFrame的索引為州別,列索引為水果種類別。
使用pd.pivot_table
進行資料重塑和聚合
當資料中存在重複值時,pd.DataFrame.pivot
可能會遇到限制。此時,pd.pivot_table
提供了一個更靈活的解決方案,它可以在重塑資料的同時進行聚合操作。
處理重複值
假設我們有一個包含年份資訊的資料集:
# 建立包含年份資訊的範例資料
data = [
["Texas", "apple", 2023, 10, 6],
["Texas", "apple", 2024, 2, 8],
["Arizona", "apple", 2023, 3, 7],
["Arizona", "apple", 2024, 6, 3],
["Texas", "orange", 2023, 5, 2],
["Texas", "orange", 2024, 5, 2],
["Arizona", "orange", 2023, 7, 2]
]
df = pd.DataFrame(data, columns=["state", "fruit", "year", "number_grown", "number_eaten"])
# 使用pivot_table進行資料重塑和聚合
pivoted_df = pd.pivot_table(df, index="state", columns="fruit", values=["number_grown", "number_eaten"])
print(pivoted_df)
輸出結果:
number_eaten number_grown
fruit apple orange apple orange
state
Arizona 5.0 2.0 4.5 7.0
Texas 7.0 2.0 6.0 5.0
內容解密
此範例展示瞭如何使用pd.pivot_table
處理包含重複值的資料。預設情況下,pd.pivot_table
會對重複值進行平均聚合。我們也可以透過aggfunc
引數自定義聚合函式,例如使用sum
進行求和操作。
使用pd.DataFrame.explode
展開列表資料
在處理包含列表或元組等序列資料的DataFrame時,pd.DataFrame.explode
提供了一種方便的方法來將這些序列展開為單獨的行。
基本用法
# 建立包含列表資料的範例DataFrame
data = {
'state': ['Texas', 'Arizona'],
'fruits': [['apple', 'banana'], ['orange', 'banana']]
}
df = pd.DataFrame(data)
# 使用explode展開列表資料
exploded_df = df.explode('fruits')
print(exploded_df)
輸出結果:
state fruits
0 Texas apple
0 Texas banana
1 Arizona orange
1 Arizona banana
內容解密
此範例展示瞭如何使用pd.DataFrame.explode
將包含列表的列展開為單獨的行。展開後的DataFrame保留了原始資料的其他列資訊,並為每個展開的元素建立了新的行。
圖表視覺化:資料重塑流程
flowchart TD A[原始資料] --> B{資料重塑需求} B -->|需要寬格式| C[使用pd.DataFrame.pivot] B -->|需要聚合操作| D[使用pd.pivot_table] B -->|包含列表資料| E[使用pd.DataFrame.explode] C --> F[寬格式資料] D --> G[聚合後的寬格式資料] E --> H[展開後的長格式資料]
圖表翻譯
此圖示展示了資料重塑的不同路徑。根據具體的資料重塑需求,我們可以選擇使用pd.DataFrame.pivot
進行簡單的重塑,pd.pivot_table
進行帶聚合的重塑,或pd.DataFrame.explode
處理包含列表的資料。每種方法都能有效地將原始資料轉換為所需的格式,以滿足不同的分析需求。