iT邦幫忙

2024 iThome 鐵人賽

DAY 11
0
Python

30 天學會用 Python pandas 和 openpyxl 處理 Excel —— 成為用 Python 處理 Excel 檔案的高手系列 第 11

Python pandas 使用 merge 水平合併 DataFrame 資料 【Python 處理 Excel #11】

  • 分享至 

  • xImage
  •  

本篇文章同步發布於 Python pandas 使用 merge 水平合併 DataFrame 資料 【Python 處理 Excel #11】

前言

當想要的資料分開放在不同地方時,就需要透過合併資料將不同來源的資料整理在同一個地方。Excel 中通常使用 VLOOKUP 或是 MATCH 加上 INDEX 進行資料合併。用 Python pandas 處理 Excel 資料時,我通常會用 merge 方法處理簡單的資料合併。這篇文章介紹 pandas 的 merge 方法。


案例說明

現在有兩個 Excel 檔案,stock.xlsx 記錄產品的庫存數量,cost_price.xlsx 記錄產品的成本價格。這個案例想要將這兩個 Excel 檔案透過 product_name 合併在一起進而得出目前的庫存金額是多少。

stock.xlsx 的內容

product_name quantity
Laptop Pro 695
Gaming Desktop 470
Ultrabook 295

cost_price.xlsx 的內容

product_name price
Laptop Pro 1000
Gaming Desktop 1200
Ultrabook 1500

pandas 的 merge 方法是什麼?

Pandas 的 merge 方法是用來合併兩個 DataFrame 的工具。類似於 SQL 的 JOIN 操作,merge 方法可以將兩個 DataFrame 基於一個或多個共同欄位進行合併。

merge 的合併類型

使用 merge 方法時,可以指定合併的方式,主要有以下幾種類型:

  • 左合併 (Left Join):保留左邊 DataFrame 的所有資料,並將右邊 DataFrame 中符合條件的資料合併進來。如果右邊 DataFrame 中沒有對應的資料,則填入 NaN
  • 右合併 (Right Join):保留右邊 DataFrame 的所有資料,並將左邊 DataFrame 中符合條件的資料合併進來。如果左邊資料框中沒有對應的資料,則填入 NaN
  • 內合併 (Inner Join):只保留兩個 DataFrame 中都有的資料。
  • 外合併 (Outer Join):保留所有 DataFrame 中的資料,對於沒有對應資料的欄位填入 NaN。

merge 的基本語法

merge 方法的基本語法如下:

pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None, sort=False)
  • left:要合併的左側 DataFrame。
  • right:要合併的右側 DataFrame。
  • how:指定合併的方式,例如 innerouterleftright
  • on:指定用於合併的欄位名稱。如果兩個 DataFrame 中的合併欄位名稱相同,可以直接使用此參數。
  • left_on:指定左側 DataFrame 中用於合併的欄位名稱。如果左側 DataFrame 中的合併欄位名稱與右側 DataFrame 不同時,使用此參數來指定左側的欄位名稱。
  • right_on:指定右側 DataFrame 中用於合併的欄位名稱。如果右側 DataFrame 中的合併欄位名稱與左側 DataFrame 不同時,使用此參數來指定右側的欄位名稱。
  • sort:是否對合併結果進行排序。預設為 False,表示不進行排序。如果設為 True,合併後的 DataFrame 將根據合併鍵進行排序。

案例演練

以下案例介紹如何使用 merge 方法將兩個 DataFrame 合併起來:

import pandas as pd

# 讀取 Excel 檔案
stock_df = pd.read_excel('stock.xlsx')
cost_df = pd.read_excel('cost_price.xlsx')

# 合併兩個 DataFrame,基於 product_name 欄位
merged_df = pd.merge(stock_df, cost_df, on='product_name', how='inner')

# 計算總庫存金額
merged_df['total_value'] = merged_df['quantity'] * merged_df['price']

print(merged_df)

解釋

  • pd.merge():on 參數指定要用來合併的欄位名稱 (product_name),how='inner' 表示進行的是內合併。
  • merged_df['total_value'] = merged_df['quantity'] * merged_df['price']:建立新欄位 total_value,該欄位計算每個產品的總庫存金額,即數量乘以價格。

on、left_on 和 right_on 參數差異

onleft_onright_on 參數用於指定合併的鍵 (key)。這三個參數的使用情境如下。

on 參數

當兩個 DataFrame 中有相同的欄位名稱時,可以使用此參數來指定用於合併的欄位。例如方才案例演練中兩個 DataFrame 都有名稱為 product_name 的欄位,此時可以以 on 參數進行合併:

merged_df = pd.merge(stock_df, cost_price_df, on='product_name')

left_on 和 right_on 參數

當左右兩側用於合併的欄位名稱不同時,可以使用 left_onright_on 參數指定各自用於合併的欄位。例如左側 DataFrame 使用 product_name 欄位,而右側 DataFrame 使用 item_name 欄位進行合併:

merged_df = pd.merge(stock_df, cost_price_df, left_on='product_name', right_on='item_name')

pandas merge 的後綴字使用時機

當合併的兩個 DataFrame 有相同的欄位名稱時,merge 方法會自動為重複的欄位加上後綴字,避免欄位名稱衝突。使用者可以透過 suffixes 參數自定義這些後綴字。例如:

merged_df = pd.merge(stock_df, cost_df, on='product_name', how='inner', suffixes=('_stock', '_cost'))

在這個例子中,如果兩個 DataFrame 都有 quantity 欄位,合併後這些欄位會分別命名為 quantity_stockquantity_cost


總結

  • pandas 的 merge 方法能合併不同來源的資料。
  • merge 提供多種合併方式,包括左合併、右合併、內合併和外合併,使用時要根據需求選擇合適的類型。
  • 當合併的資料中有重複的欄位名稱,可以使用 suffixes 參數自定義欄位後綴字,避免欄位名稱衝突。

本篇文章同步發布於 Python pandas 使用 merge 水平合併 DataFrame 資料 【Python 處理 Excel #11】


上一篇
Python pandas 刪除 DataFrame 資料 【Python 處理 Excel #10】
下一篇
Python pandas 使用 iterrows 逐一更新資料【Python 處理 Excel #12】
系列文
30 天學會用 Python pandas 和 openpyxl 處理 Excel —— 成為用 Python 處理 Excel 檔案的高手30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言