Pandas 提供了強大的資料框架操作功能,其中合併和重塑是資料分析的關鍵步驟。合併資料框架時,pd.merge 函式可處理不同名稱或多個合併鍵的情況,並透過引數控制合併方式。left_onright_on 引數指定不同名稱的合併鍵,how 引數控制外連線等合併方式,suffixes 引數則避免欄位名稱衝突。資料重塑方面,pd.DataFrame.stack 將寬格式資料轉換為長格式,pd.DataFrame.unstack 則反向操作。pd.melt 提供另一種寬格式到長格式的轉換方式,更靈活地處理欄位名稱和值。此外,pd.wide_to_long 函式適用於欄位名稱遵循特定模式的寬格式資料轉換,而 pd.DataFrame.pivotpd.pivot_table 則能將長格式資料轉換為寬格式,並支援聚合操作,提升資料分析效率。

資料框架合併的關鍵考量

在進行資料分析時,合併多個資料框架(DataFrame)是常見的需求。Pandas 函式庫提供了 pd.merge() 函式來實作此功能。然而,當合併的鍵(key)在兩個資料框架中名稱不同,或是合併鍵不唯一時,就需要特別注意。

合併鍵名稱不同時的處理

當兩個資料框架的合併鍵名稱不同時,可以使用 left_onright_on 引數來指定。例如,若 df_q1 的合併鍵為 ticker,而 df_q2 的合併鍵為 SYMBOL,可以這樣進行合併:

pd.merge(
    df_q1,
    df_q2,
    left_on=["ticker"],
    right_on=["SYMBOL"],
    how="outer",
    suffixes=("_q1", "_q2"),
)

內容解密:

  • left_on=["ticker"] 指定左側資料框架 df_q1 的合併鍵為 ticker
  • right_on=["SYMBOL"] 指定右側資料框架 df_q2 的合併鍵為 SYMBOL
  • how="outer" 表示進行外連線(outer join),保留兩個資料框架中的所有資料。
  • suffixes=("_q1", "_q2") 用於在重複的欄位名稱後新增字尾,以區別來源。

多重合併鍵的處理

當需要根據多個欄位進行合併時,可以將這些欄位名稱以列表形式傳遞給 left_onright_on。例如:

pd.merge(
    lows,
    highs,
    left_on=["ticker", "quarter"],
    right_on=["SYMBOL", "QTR"],
)

內容解密:

  • left_on=["ticker", "quarter"]right_on=["SYMBOL", "QTR"] 分別指定了左右資料框架的合併鍵。
  • 這種方式允許根據多個欄位的組合進行合併。

合併鍵唯一性的考量

在進行資料合併時,瞭解合併鍵的唯一性非常重要。根據合併鍵在兩個資料框架中的唯一性,可以分為一對一(1-to-1)、多對一(n-to-1)、一對多(1-to-n)和多對多(n-to-n)四種情況。

多對一和一對多的情況

當一個資料框架中的合併鍵有多個重複值,而另一個資料框架中的合併鍵是唯一的,則屬於多對一或一對多的情況。這種情況下,pd.merge() 可以正確地進行合併。

pd.merge(sales, regions_orig, on=["salesperson"])

內容解密:

  • 銷售資料(sales)中的銷售員(salesperson)有多個重複值。
  • 地區資料(regions_orig)中的銷售員是唯一的。
  • 合併結果將銷售資料與地區資訊正確匹配。

多對多的情況

當兩個資料框架中的合併鍵都有重複值時,則屬於多對多的情況。這種情況下,pd.merge() 會產生笛卡爾積,可能導致資料重複。

pd.merge(sales, regions, on=["salesperson"])

內容解密:

  • 當地區資料(regions)中出現多個同名的銷售員時,合併結果會將銷售資料中的每一行與地區資料中的所有匹配行進行組合,導致資料重複。
  • 這種情況下,需要特別注意合併結果的正確性。

驗證合併關係

為了避免因合併鍵唯一性問題導致的錯誤,可以使用 validate 引數來驗證合併關係。例如:

pd.merge(sales, regions_orig, on=["salesperson"], validate="many_to_one")

內容解密:

  • validate="many_to_one" 用於驗證合併關係是否為多對一。如果不是,將會引發錯誤。

重塑DataFrame:資料合併與重構的藝術

在資料分析的世界中,資料的形狀往往決定了分析的難易程度。pd.mergepd.DataFrame.join 是兩種常見的資料合併方法,而 pd.DataFrame.stackpd.DataFrame.unstack 則是用於資料重塑的強大工具。本篇文章將探討這些方法的應用與技巧。

使用pd.merge進行資料合併

當需要合併兩個不同的DataFrame時,pd.merge是最常用的方法。它允許你根據一個或多個共同欄位進行合併。

資料驗證的重要性

在進行資料合併時,資料驗證是至關重要的。透過validate引數,你可以檢查合併操作的合理性,例如檢查是否為多對一的合併。

pd.merge(sales, regions, on=["salesperson"], validate="many_to_one")

如果資料不符合預期的合併關係,pd.merge會丟擲錯誤。這種機制可以幫助你及早發現資料問題,避免錯誤的資料被悄悄地合併。

使用pd.DataFrame.join進行資料合併

pd.DataFrame.join是另一種資料合併的方法,它預設使用索引進行合併。這使得它在某些情況下比pd.merge更方便。

sales.join(salesperson)

#### 內容解密:

  • sales.join(salesperson)預設進行左合併(left join),保留左側DataFrame的所有列。
  • 當索引匹配時,右側DataFrame的資料會被合併進來。
  • 如果右側DataFrame中沒有匹配的索引,則對應的列會填充為NA。

資料重塑:從寬格式到長格式

在資料分析中,我們經常需要在寬格式(wide format)和長格式(long format)之間轉換。寬格式的資料橫向展開,適合人類閱讀;長格式的資料則更適合某些資料函式庫和統計分析。

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

stack方法可以將寬格式的資料轉換為長格式。

df = pd.DataFrame([
    [12, 10, 40],
    [9, 7, 12],
    [0, 14, 190]
], columns=pd.Index(["Apple", "Orange", "Banana"], name="fruit"), index=pd.Index(["Texas", "Arizona", "Florida"], name="state"))

df_stacked = df.stack()

#### 內容解密:

  • df.stack()將原有的欄位(fruit)下移至索引層級,形成多層索引。
  • 資料從寬格式轉換為長格式,更適合某些資料函式庫和統計分析的需求。

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

stack相反,unstack方法可以將長格式的資料轉換回寬格式。

df_unstacked = df_stacked.unstack()

#### 內容解密:

  • df_unstacked將多層索引中的某一層還原為欄位,使資料回到寬格式。
  • 這種轉換使得資料更易於閱讀和理解。

結語

掌握pd.mergepd.DataFrame.joinpd.DataFrame.stackpd.DataFrame.unstack的使用,可以大大提升你在資料分析和處理上的效率。無論是資料合併還是重塑,這些工具都能幫助你更好地理解和利用你的資料。透過合理的資料處理,你可以更準確地得出分析結論,並為業務決策提供有力的支援。

資料重塑:從寬格式轉換為長格式

在資料處理和分析中,經常需要將資料從寬格式轉換為長格式,或是反向轉換。Pandas 提供了多種方法來實作這一點,包括 stack()unstack()melt()

使用 stack()unstack() 進行資料重塑

首先,讓我們建立一個簡單的 DataFrame,並將其從寬格式轉換為長格式。

import pandas as pd

# 建立一個寬格式的 DataFrame
df = pd.DataFrame([
    ["Texas", 12, 10, 40],
    ["Arizona", 9, 7, 12],
    ["Florida", 0, 14, 190]
], columns=["state", "Apple", "Orange", "Banana"])

df = df.convert_dtypes(dtype_backend="numpy_nullable")
print(df)

輸出:

     state  Apple  Orange  Banana
0    Texas     12      10      40
1  Arizona      9       7      12
2   Florida      0      14     190

內容解密:

  • 這段程式碼建立了一個 DataFrame,代表不同州的水果產量。
  • convert_dtypes() 用於最佳化資料型別。

要將這個寬格式的 DataFrame 轉換為長格式,可以使用 set_index()stack() 方法:

df_long = df.set_index("state").stack().reset_index()
df_long.columns = ["state", "fruit", "number_grown"]
print(df_long)

輸出:

     state   fruit  number_grown
0    Texas   Apple             12
1    Texas  Orange             10
2    Texas  Banana             40
3  Arizona   Apple              9
4  Arizona  Orange              7
5  Arizona  Banana             12
6   Florida   Apple              0
7   Florida  Orange             14
8   Florida  Banana            190

內容解密:

  • set_index("state") 將 “state” 列設定為索引。
  • stack() 將欄位索引堆積疊到行索引,建立一個多級索引的 Series。
  • reset_index() 將多級索引轉換回 DataFrame,並重置索引。
  • 最後重新命名欄位以便閱讀。

使用 melt() 進行資料重塑

melt() 是另一種將寬格式 DataFrame 轉換為長格式的方法。

df_melted = df.melt(id_vars=["state"], var_name="fruit", value_name="number_grown")
print(df_melted)

輸出:

     state   fruit  number_grown
0    Texas   Apple             12
1  Arizona   Apple              9
2   Florida   Apple              0
3    Texas  Orange             10
4  Arizona  Orange              7
5   Florida  Orange             14
6    Texas  Banana             40
7  Arizona  Banana             12
8   Florida  Banana            190

內容解密:

  • id_vars=["state"] 指定 “state” 為識別變數,不參與融合。
  • var_name="fruit"value_name="number_grown" 分別指定新生成的變數名稱和值名稱。

對比與選擇

stack()melt() 都可以用於將寬格式轉換為長格式,但它們的使用場景和靈活性有所不同。stack() 需要先設定索引,而 melt() 直接在原始 DataFrame 上操作,提供更多的靈活性。

資料重塑:從寬格式轉換為長格式與反向轉換

在資料分析中,經常需要對資料進行重塑,以適應不同的分析需求。Pandas 提供了多種方法來實作資料的重塑,包括 pd.DataFrame.stackpd.DataFrame.meltpd.wide_to_longpd.DataFrame.pivotpd.pivot_table。本篇文章將介紹如何使用這些方法來進行資料重塑。

使用 pd.wide_to_long 進行寬格式到長格式的轉換

pd.wide_to_long 是一種用於將寬格式資料轉換為長格式資料的函式,尤其是在欄位名稱遵循特定模式時非常有用。

程式碼範例:

import pandas as pd

# 建立範例資料
df = pd.DataFrame([
    ["Widget 1", 1, 2, 4, 8],
    ["Widget 2", 16, 32, 64, 128],
], columns=["widget", "quarter_1", "quarter_2", "quarter_3", "quarter_4"])

# 使用 pd.wide_to_long 進行轉換
df_long = pd.wide_to_long(df, i=["widget"], stubnames="quarter_", j="quarter").reset_index().rename(columns={"quarter_": "quantity"})

print(df_long)

內容解密:

  1. 建立範例資料:首先,我們建立了一個包含 widget 資訊和四個季度銷售資料的 DataFrame。
  2. pd.wide_to_long 轉換:使用 pd.wide_to_long 將寬格式資料轉換為長格式。其中,i=["widget"] 指定了要保留的欄位,stubnames="quarter_" 指定了要轉換的欄位名稱的字首,j="quarter" 指定了新產生的欄位名稱。
  3. 結果:轉換後的資料中,每一行代表一個 widget 在某個季度的銷售資料。

使用 pd.DataFrame.pivotpd.pivot_table 進行長格式到寬格式的轉換

pd.wide_to_long 相反,pd.DataFrame.pivotpd.pivot_table 可以將長格式資料轉換為寬格式。

程式碼範例:

# 建立範例資料
df = pd.DataFrame([
    ["Texas", "apple", 12, 8],
    ["Arizona", "apple", 9, 10],
    ["Florida", "apple", 0, 6],
    ["Texas", "orange", 10, 4],
    ["Arizona", "orange", 7, 2],
    ["Florida", "orange", 14, 3],
], columns=["state", "fruit", "number_grown", "number_eaten"])

# 使用 pd.DataFrame.pivot 進行轉換
df_wide = df.pivot(index=["state"], columns=["fruit"])

print(df_wide)

內容解密:

  1. 建立範例資料:建立了一個包含州別、水果種類別和相關數量的 DataFrame。
  2. pd.DataFrame.pivot 轉換:使用 pivot 方法將長格式資料轉換為寬格式。其中,index=["state"] 指定了新的 DataFrame 的索引,columns=["fruit"] 指定了新的欄位名稱。
  3. 結果:轉換後的資料中,每一行代表一個州,各欄位代表不同水果的相關數量。

重塑資料的高階技巧

除了上述基本用法外,Pandas 的重塑函式還支援更複雜的操作,如聚合。

使用 pd.pivot_table 進行聚合

# 建立範例資料
df = pd.DataFrame([
    ["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],
], columns=["state", "fruit", "number_grown", "number_eaten"])

# 使用 pd.pivot_table 進行轉換和聚合
df_pivot_table = df.pivot_table(index="state", columns="fruit", values="number_grown", aggfunc="sum")

print(df_pivot_table)

圖表翻譯:

此圖表展示了使用 pd.pivot_table 對資料進行重塑和聚合的結果。其中,橫軸代表不同的水果種類別,縱軸代表不同的州,各單元格中的值代表該州該水果的總產量。