Pandas 提供了多元的資料重塑方法,靈活應對不同資料格式的轉換需求。stackmelt 方法能有效地將寬格式資料轉換為長格式,適用於單一索引或多層索引的資料結構。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.stackpd.DataFrame.meltpd.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)

程式碼解析:

  1. 首先,我們建立了一個包含州名和水果數量的 DataFrame。
  2. 使用 set_index("state") 將 “state” 欄位設為索引。
  3. stack() 方法將 DataFrame 從寬格式轉換為長格式。
  4. reset_index() 用於重置索引,將原來的索引欄位轉換為普通的欄位。
  5. 最後,使用 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)

程式碼解析:

  1. id_vars=["state"] 指定 “state” 欄位保持不變。
  2. var_name="fruit" 將原來的欄位名稱(apple、orange、banana)重新命名為 “fruit”。
  3. 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)

程式碼解析:

  1. stubnames='quarter_' 指定了欄位名稱的字首。
  2. i=['widget'] 指定 “widget” 欄位保持不變。
  3. j='quarter' 將提取的數字部分命名為 “quarter”。

從長格式轉換為寬格式

要將資料從長格式轉換為寬格式,可以使用 pd.DataFrame.pivotpd.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)

程式碼解析:

  1. index="state" 指定 “state” 欄位作為索引。
  2. columns="fruit" 將 “fruit” 欄位的值轉換為新的欄位名稱。
  3. 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)

程式碼解析:

  1. values="number_grown" 指定需要聚合的欄位。
  2. 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[完成資料重塑]

圖表解析:

此圖表展示了資料重塑的主要流程,包括選擇合適的重塑方法(stackmeltwide_to_long),執行相應的操作,並最終完成資料重塑。不同的路徑代表了不同的重塑方法,但最終都匯聚到重置索引和重新命名欄位的步驟,以確保輸出的資料格式正確且易於閱讀。

資料重塑:靈活運用Pandas進行資料轉換

在資料分析過程中,資料的重塑是一項至關重要的任務。Pandas提供了多種強大的工具來實作資料的重塑,其中包括pd.DataFrame.pivotpd.pivot_tablepd.DataFrame.explode等方法。本文將深入探討這些方法的應用場景和具體實作方式。

使用pd.DataFrame.pivot進行資料重塑

pd.DataFrame.pivot是一種用於將長格式資料轉換為寬格式資料的方法。它需要指定indexcolumns引數來決定新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處理包含列表的資料。每種方法都能有效地將原始資料轉換為所需的格式,以滿足不同的分析需求。