而Pandas套件常見的合併情境通常分為「逐列合併」、「逐欄合併」與「關聯合併」,本文就分別使用Kaggle網站上的三個不同資料集,來和大家分享Pandas套件合併多個CSV檔案資料的實作方式,重點包含:
- Pandas concat()-逐列合併
- Pandas concat()-逐欄合併
- Pandas merge()-關聯合併
一、Pandas concat()-逐列合併
「逐列合併」就是多個檔案的欄位皆相同,想要合併列(row)的資料內容。
以Kaggle網站的Twitter 2010-2021年最新消息資料集為例,包含了BBC(tweets_bbc.csv)、CNN(tweets_cnn.csv)與Economist(tweets_eco.csv)三個新聞媒體的檔案資料,其中的欄位皆相同,但是資料內容不同,這時候想要利用Pandas套件來進行資料合併,可以先將下載下來的檔案,放到data資料夾中,如下圖:
import pandas as pd from glob import glob
glob是一個檔名模式匹配(filename pattern matching)模組(Module),用來定義檔案規則,取得相匹配的檔案清單串列(List),讓我們在合併多個檔案資料的過程中,能夠一次取得所有的檔案清單,提升讀取效率,如下範例:
import pandas as pd from glob import glob files = glob('data/tweets*.csv') print(files)
執行結果
['data\\tweets_bbc.csv', 'data\\tweets_cnn.csv', 'data\\tweets_eco.csv']
以上範例,就是利用glob模組(Module),取得data資料夾下,所有tweets開頭的csv檔案清單,接下來,就可以使用Pandas套件的read_csv()方法(Method),透過迴圈進行讀取,同時呼叫concat()方法(Method),合併資料內容,如下範例:
import pandas as pd from glob import glob files = glob('data/tweets*.csv') df = pd.concat( (pd.read_csv(file, usecols=['name','tweet'], dtype={ 'name': str, 'tweet':str}) for file in files), ignore_index=True) print(df)
執行結果
- usecols-僅讀取name(媒體名稱)與tweet(最新消息)兩個欄位,避免因資料龐大耗用大量的記憶體資源。
- dtype-設定欄位的資料型態,省去Pandas套件在合併過程的欄位型態猜測。
- ignore_index=True-忽略三個檔案的資料索引值(index),讓Pandas DataFrame在合併後重新編排,否則會因為Pandas套件的concat()方法(Method)預設為索引值合併(axis='index'),導致合併後索引值重複。
二、Pandas concat()-逐欄合併
「逐欄合併」就是多個檔案的欄位都不相同,想要合併欄位(column)的資料內容。
大家可以下載Kaggle網站的2021年富比士億萬富翁資料集(Billionaire.csv),並且將其中的Name(姓名)、NetWorth(淨值)及Country(國家)三個欄位另存為billionaire_info.csv,而收入來源(Source)及排名(Rank)二個欄位另存為billionaire_rank.csv,來模擬Pandas套件的concat()方法(Method)如何合併多個檔案的欄位資料內容。接著,將另存的兩個檔案放到data資料夾中,如下圖:
而合併的實作方式與「逐列合併」大同小異,只有在Pandas套件的concat()方法(Method),需設定axis關鍵字參數為columns,以欄位(column)進行合併,如下範例:
import pandas as pd from glob import glob files = glob('data/billionaire*.csv') df = pd.concat((pd.read_csv(file, dtype={'Rank': str}) for file in files), axis='columns') print(df)
執行結果
三、Pandas merge()-關聯合併
最後還有一個蠻常見的合併方式,叫「關聯合併」,也就像資料庫一樣,各檔案中至少有一個主鍵欄位,能夠用來串連多個檔案的資料。
以Kaggle網站的Coursera平台的課程評論資料集為例,包含了課程(Coursera_courses.csv)與評論(Coursera_reviews.csv)兩個檔案,開啟後,可以看到兩者都有course_id欄位,並且透過這個欄位能將兩個檔案的每筆資料串在一起,得到每一個課程的多筆評論,所以course_id就是主鍵欄位,能夠用來關聯兩個檔案的資料內容,如下圖:
import pandas as pd from glob import glob files = glob('data/Coursera*.csv') df_list = [pd.read_csv(file) for file in files] #串列中包含兩個Pandas DataFrame
import pandas as pd from glob import glob files = glob('data/Coursera*.csv') df_list = [pd.read_csv(file) for file in files] #串列中包含兩個Pandas DataFrame result = pd.merge(df_list[0], df_list[1], on='course_id') print(result)
截取部分執行結果
import pandas as pd from glob import glob files = glob('data/Coursera*.csv') df_list = [pd.read_csv(file) for file in files] #串列中包含兩個Pandas DataFrame for df in df_list[1:]: #從第二個Pandas DataFrame開始 result = pd.merge(df_list[0], df, on='course_id') #逐一基於course_id欄位合併到第一個Pandas DataFrame print(result)
假設想要看「Machine Learning」這門課程的評論,就可以利用Pandas套件的loc語法來進行篩選,如下範例:
import pandas as pd from glob import glob files = glob('data/Coursera*.csv') df_list = [pd.read_csv(file) for file in files] #串列中包含兩個Pandas DataFrame for df in df_list[1:]: #從第二個Pandas DataFrame開始 result = pd.merge(df_list[0], df, on='course_id') #逐一基於course_id欄位合併到第一個Pandas DataFrame filt = (result['name'] == 'Machine Learning') print(result.loc[filt].head(10)) #取前10筆
截取部分執行結果
四、小結
本文舉了三個在實務上很常見的CSV資料合併場景,分別為逐列合併、逐欄合併與關聯合併,讓大家瞭解Pandas套件的concat()及merge()合併方法(Method)的使用方式,有效整合多個CSV檔案的資料內容,來進行後續的資料分析,希望對於日常生活中,需要整合多個CSV檔案資料的朋友有所幫助,別忘了下載本文範例的Kaggle網站資料集,動手實作看看唷~
如果喜歡我的文章,別忘了在下面訂閱本網站,以及幫我按五下Like(使用Google或Facebook帳號免費註冊),支持我創作教學文章,回饋由LikeCoin基金會出資,完全不會花到錢,感謝大家。
- [Pandas教學]看完這篇就懂Pandas套件如何即時讀取API的回應資料
- [Pandas教學]快速掌握Pandas套件讀寫SQLite資料庫的重要方法
- [Pandas教學]輕鬆入門3個常見的Pandas套件排序資料方式
- [Pandas教學]有效利用Pandas套件篩選資料的應用技巧
- [Pandas教學]善用Pandas套件的Groupby與Aggregate方法提升資料解讀效率
- [Pandas教學]使用Pandas套件實作資料清理的必備觀念(上)
- [Pandas教學]使用Pandas套件實作資料清理的必備觀念(下)
- Visual Studio Code漂亮印出Pandas DataFrame資料的實用方法
- [Pandas教學]資料視覺化必懂的Pandas套件繪製Matplotlib分析圖表實戰
- [Pandas教學]5個實用的Pandas讀取Excel檔案資料技巧
- 解析Python網頁爬蟲如何有效整合Pandas套件提升資料處理效率
- [Pandas教學]掌握Pandas DataFrame讀取網頁表格的實作技巧
- [Pandas教學]資料分析必懂的Pandas DataFrame處理雙維度資料方法
- [Pandas教學]資料分析必懂的Pandas Series處理單維度資料方法
留言
張貼留言