Pandas Excel merge join combine python 資料整理 inner outer

從生活了解Pandas – 多個檔案

張庭瑋 Gary Chang 2023/09/01 17:00:00
359

 

簡介

 

整合複數Excel的資料常常令人頭痛,Pandas讓你省時又省心

 而這次文章為貼近真實情境,會以Excel做範例,可以自己動手玩玩看喔!

 

 

 

情境: 

 

想像你是一位水果店店長,手上拿到了兩份資料:

 

FruitColor 水果顏色對應表

 

FruitPrice 水果價格表

 

兩個檔案同時切換比對太麻煩了!

我們可以使用 join

data = data1.join(data2)

 

實際如下

import pandas as pd  

Price_data = pd.read_excel('FruitPrice.xlsx' ,index_col=0)
Color_data = pd.read_excel('FruitColor.xlsx' ,index_col=0)

T_data = Price_data.join(Color_data)

T_data.to_excel('Total_data.xlsx')

 

這邊在路徑後面增加了index_col=0,告訴Pandas要以水果那一欄位底下的值為主

 

 

打開產生的檔案Total_data

Pandas 會幫我們把對應的資料排好--- 一目瞭然,太棒了 !

 

 

 

但是真實生活中,資料來源不可能這麼整齊,對吧?

 

過了幾天,我們拿到了新的表單:

 

Fruit_oulook


 

Fruit_value


 

我們還是可以使用join,不過Fruit_value的水果欄位就要調整:

data1 = pd.read_excel(Fruit_outlook.xlsx' ,index_col=0)
data2 = pd.read_excel('Fruit_value.xlsx' ,index_col=2)

 

“欄位上百上千的話不就要數到眼花了嗎?!“

 

這時 merge 會是更好的選擇

Data=pd.merge(‘File1’, ‘File2’,on=’指定欄位名稱’)

 

 

實際如下

 

import pandas as pd  

data1 = pd.read_excel('Fruit_outlook.xlsx')
data2 = pd.read_excel('Fruit_value.xlsx')

data3 = pd.merge(data1, data2 , on = '水果')

data3.to_excel('data3.xlsx')

 

結果會產生一個data3.xlsx的檔案

會依據指定的欄(水果),將對應的資料排好

 

 

 

細節補充

 

 看到這邊,讀者應該會想問什麼時候用join  和 merge到底差在哪裡?

 

先說結論:在使用Excel的情境中,merge比較直觀且方便

 

 

差異比較如下:

 

欄列有別:

merge 預設以處理欄 (column)為主,不過也可以處理列(index)的值

join 只能處理列(index)的值

 

彈性:

merge 可以搭配 inner / outer 等不同語法,讓使用者可以在不同情境下應用

join  使用情境較單一

 

處理速度:

join 會比merge來得快(數據非常大量的話)

 

以上的比較都是建立在使用Pandas讀寫Excel資料的情境中,若是換到分析API, 爬蟲數據或函示庫…join merge差異才會比較明顯

 

 

inner / outer

 

inner 只處理共同擁有的資料

 

outer 處理所有的資料,若有無法對應的資料,會顯示NaN

 

 

舉例如下:

import pandas as pd

# 範例資料庫
df1 = pd.DataFrame({'key': ['A', 'B', 'C'], 'value1': [1, 2, 3]})
df2 = pd.DataFrame({'key': ['B', 'C', 'D'], 'value2': [4, 5, 6]})

print('Original data:')
print(df1)
print(df2)

# Inner Merge
result_inner = pd.merge(df1, df2, on='key')  # Returns only B and C

print("\nInner Merge:")
print(result_inner)

# Outer Merge
result_outer = pd.merge(df1, df2, on='key', how='outer')  # Returns A, B, C, and D

print("\nOuter Merge:")
print(result_outer)

 

 

結果如下:

Original data:
  key  value1
0   A       1
1   B       2
2   C       3
  key  value2
0   B       4
1   C       5
2   D       6

Inner Merge:
  key  value1  value2
0   B       2       4
1   C       3       5
#inner 只處理共同擁有的資料


Outer Merge:
  key  value1  value2
0   A     1.0     NaN
1   B     2.0     4.0
2   C     3.0     5.0
3   D     NaN     6.0
#outer 處理所有的資料,若有無法對應的資料,會顯示NaN

 

 

 inner 也能當作一種篩選的方式

也可以用outer 搭配前一篇文章的replace,把NaN換成自己要的數值

 

 

總結

 

這次介紹了merge和join來處理複數檔案,Excel的情境下筆者會強烈建議使用merge,再搭配inner / outer 便能組合出自己想要的資料格式。 merge 還有 left / right 可以使用,但筆者認為 inner /outer 足以應付大多數情況,有興趣的讀者可以參考這篇文章

 

 

參考資料

https://datacomy.com/data_analysis/pandas/merge/

https://stackoverflow.com/questions/53645882/pandas-merging-101

 

 

張庭瑋 Gary Chang