iT邦幫忙

2024 iThome 鐵人賽

DAY 14
0
Python

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

Python pandas 使用 concat 將不同 DataFrame 垂直連接在一起【Python 處理 Excel #14】

  • 分享至 

  • xImage
  •  

本篇文章同步發布於 Python pandas 使用 concat 將不同 DataFrame 垂直連接在一起【Python 處理 Excel #14】

前言

當有多份 Excel 檔案標題欄位一樣,只是因為時間、版本等因素有多份檔案存在,如果某個時刻需要將這些不同的檔案資料放在一起,除了一個個打開檔案將資料複製到同一個活頁簿中,也可以使用 Python pandas 的 concat 方法將不同的檔案資料合併在一起。這篇文章介紹 Python pandas 的 concat 方法。


案例說明

公司每個月發布一次該月對未來的銷售預測資料,不同月份的銷售預測資料會以不同的版本編碼 (version) 表示,例如 S1 表示 1 月的銷售預測資料,S2 表示 2 月的銷售預測資料,S3 表示 3 月的銷售預測資料,以此類推。下方是其中一個銷售預測檔案的部分資料 (含標題):

create_date version period customer_name product quantity
2024/2/1 S2 2024/004 Coolify Laptop Pro 500
2024/2/1 S2 2024/004 Coolify Ultrabook 300
2024/2/1 S2 2024/004 Nexida Laptop Pro 100
2024/2/1 S2 2024/004 Stella Tech Laptop Pro 300

資料中的 period 欄位表示針對哪個年份/月份進行銷售預測。現在電腦的某個資料夾有多個版本的銷售預測資料,希望透過 Python 將這些檔案合併在同一份檔案。


合併兩個路徑明確的Excel 檔案

從一個簡單的例子開始:假設有兩個明確知道檔案位置的 Excel 檔案,下方程式碼能將這兩個 Excel 檔案合併在一起:

import pandas as pd

# 讀取兩個 Excel 檔案
df1 = pd.read_excel('path_to_file/S1_forecast.xlsx')
df2 = pd.read_excel('path_to_file/S2_forecast.xlsx')

# 使用 pandas concat 合併兩個 DataFrame
merged_df = pd.concat([df1, df2])

# 輸出合併後的結果
print(merged_df.head())

解釋

  • path_to_file:需要根據實際情況替換為正確的路徑。
  • pd.concat():將 df1df2 這兩個 DataFrame 合併成一個新的 DataFrame。concat 方法預設是保有原本的欄位結構,將 df1df2 的所有列合併在一起。

在現有的 DataFrame 中新增列資料

接下來例子會用 pandas 的 concat 方法將新的銷售預測資料新增到現有的 DataFrame 中。

# 讀取已存在的 Excel 檔案
df = pd.read_excel('path_to_file/S1_forecast.xlsx')

# 定義一組新的銷售資料,使用 Series 表示
new_row = pd.Series({
    'create_date': '2024/2/1',
    'version': 'S2',
    'period': '2024/004',
    'customer_name': 'Quick Computer',
    'product': 'Gaming Laptop',
    'quantity': 150
})

# 使用 concat 將新的 row 加入 DataFrame 中
updated_df = pd.concat([df, new_row.to_frame().T], ignore_index=True)

# 輸出更新後的 DataFrame
print(updated_df.tail())

解釋

  • new_row.to_frame().T:將 Series 轉換成一個 DataFrame 並轉置 (transpose),因為 concat 需要一個 DataFrame 作為參數。
  • ignore_index=True:在合併時重新設定索引,避免不同檔案可能存在重複或混亂的索引問題。

動態讀取多個 Excel 檔案並合併

實務上我個人常將相同性質的檔案放在同一個資料夾,這個案例的銷售預測檔案也一樣。現在有一個資料夾包含了不同版本的銷售預測檔案,下方程式碼動態讀取這些 Excel 檔案並將它們合併成一個單一的 DataFrame。

import os
import pandas as pd

# 指定包含 Excel 檔案的資料夾路徑
folder_path = 'path_to_folder/'

# 動態讀取資料夾中的所有 Excel 檔案
file_list = [os.path.join(folder_path, f) for f in os.listdir(folder_path) if f.endswith('.xlsx')]

# 讀取所有 Excel 檔案並儲存在 DataFrame 列表中
df_list = [pd.read_excel(file) for file in file_list]

# 使用 concat 合併所有 DataFrame,並忽略索引
merged_df = pd.concat(df_list, ignore_index=True)

# 輸出最終合併後的 DataFrame
print(merged_df.head())

解釋

  • file_list:這是一個包含多個檔案路徑的列表 (list),每個元素都是一個 Excel 檔案的完整路徑。這些檔案是想要合併的銷售預測檔案,例如 ['S1_forecast.xlsx', 'S2_forecast.xlsx', ...]
  • for file in file_list:這是 list comprehension 的用法,表示從 file_list 中逐一取出每個檔案路徑,並將每個檔案應用到 pd.read_excel() 方法中。
  • df_list:這是一個包含多個 DataFrame 的列表。每個列表中的元素都是讀取 Excel 檔案後的 DataFrame。例如有三個檔案,df_list 可能會是 [DataFrame1, DataFrame2, DataFrame3] 的結構,每個 DataFrame 分別代表不同的銷售預測資料。

總結

  • 使用 concat 方法可以將多個 DataFrame 合併為一個 DataFrame。
  • 設定 ignore_index=True 可以避免索引重複。
  • Series 搭配 concat 方法可以在現有的 DataFrame 中新增新列資料。

本篇文章同步發布於 Python pandas 使用 concat 將不同 DataFrame 垂直連接在一起【Python 處理 Excel #14】


上一篇
除了 sum(),Python pandas 還有哪些更新資料的方法?【Python 處理 Excel #13】
下一篇
使用 Python pandas 的 groupby 實現類似 Excel 樞紐分析的功能【Python 處理 Excel #15】
系列文
30 天學會用 Python pandas 和 openpyxl 處理 Excel —— 成為用 Python 處理 Excel 檔案的高手30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言