iT邦幫忙

2023 iThome 鐵人賽

DAY 6
0
自我挑戰組

我與熊貓Pandas相處的日子系列 第 6

Day6- 資料處理(2)資料合併

  • 分享至 

  • xImage
  •  

資料搜集後常會分布在不同的檔案中,使用Pandas讀取後再將資料合併。Pandas提供了append(資料附加)、concat(資料串接)及merge(資料融合)進行資料合併。

1.資料附加
將資料加在原始資料的後方,語法如下:

DataFrame變數A.append(DataFrame變數B,ignore_index=布林值)

ignore_index:是否重新建立索引,預設為False,不會重新建立索引。
若附加時有欄位不相符時,會保留所有欄位,原始資料中沒有的欄位資料會以空值填充。

2.資料串接

pd.concat([DataFrame變數A,DataFrame變數B],ignore_index=布林值,join=合併方式)

ignore_index:是否重新建立索引,預設為False。
join:"outer"為聯集-保留所有欄位(與append相同),此為預設值,"inner"為交集-共同的欄位才會保留(如果資料有NaN時)。

3.資料融合

merge為最常使用的資料合併方式。

pd.merge(DataFrame變數A,DataFrame變數B, left_on=欄位, right_on=欄位,suffixes=[後綴文字1,後綴文字2,...],how=合併方式)

left_on:設定第一個資料集為合併欄位基準。
right_on:設定第二個資料集為合併欄位基準。
on:設定第二個資料集共同欄位為合併欄位基準。
suffixes:設定值為一串列,若合併資料有相同欄位名稱,則可以此參數加後綴名稱以示區別。
how:
(1)outer(聯集)-會保留所有欄位
(2)inner(交集)-只會保留共同欄位
(3)left-保留第一個資料集所有欄位資料
(4)right-保留第二個資料集所有欄位資料

(1)一對一融合

pd.merge(DataFrame變數A,DataFrame變數B,how=合併方式)

how非必要參數,預設為inner(交集),故若省略則合併將保留共同索引(第一欄位)及所有欄位的資料。
若how為outer(聯集),則所有資料(索引(列)+欄位(行))都保留,缺值欄位以NaN填充。

(2)指定欄位融合

當兩邊index不一樣時可以使用left_on和right_on來指定merge的index。
若有A及B二個共同的欄位,使用left_on和right_on參數來指定融合參考欄位為A,融合後系統會自動替相同欄位B名稱後面加上「B_x」及「B_y」後綴做為區別。

pd.merge(DataFrame變數A,DataFrame變數B, left_on=欄位A, right_on=欄位A)

(3)自定義重覆欄位名稱後綴文字

a.在merge中當欄位名稱重覆時,使用suffixes來自定義欄位名稱後綴文字。

pd.merge(DataFrame變數A,DataFrame變數B, left_on=欄位, right_on=欄位,suffixes=[欄位名稱加1,欄位名稱加2])

使用suffixes參數為串列,記得加中括號[]。
以上"left_on=欄位, right_on=欄位"相同時亦可簡化為"on=欄位"。

b.將重複的欄位b使用drop語法刪除。

pd.merge(ironman6, ironman13, left_on=欄位a, right_on=欄位b).drop(欄位b',axis=1)

<範例說明>資料融合

import pandas as pd
df1=pd.DataFrame([[1,7,6],[2,4,2]],columns=['水果號碼','芭樂','香蕉',])
df2=pd.DataFrame([[2,4,2],[3,9,5],[4,2,8]],columns=['水果號碼','橘子','檸檬'])
print(df1)
print(df2)


   水果號碼  芭樂  香蕉
0     1   7   6
1     2   4   2
   水果號碼  橘子  檸檬
0     2   4   2
1     3   9   5
2     4   2   8
pd.merge(df1,df2)

	水果號碼	芭樂	香蕉	橘子	檸檬
0	2	4	2	4	2
pd.merge(df1,df2,how='outer')

      水果號碼	芭樂	香蕉	檸檬 
0	1	7	6.0	NaN
1	2	4	2.0	NaN
2	1	4	NaN	2.0
3	2	9	NaN	5.0
4	3	2	NaN	8.0
import pandas as pd
df1=pd.DataFrame([[1,7,6],[2,4,2]],columns=['水果號碼','芭樂','香蕉',])
df2=pd.DataFrame([[1,4,2],[2,9,5],[3,2,8]],columns=['水果號碼','芭樂','檸檬'])
print(df1)
print(df2)
pd.merge(df1,df2,left_on='水果號碼', right_on='水果號碼')


  水果號碼  芭樂  香蕉
0     1   7   6
1     2   4   2
   水果號碼  芭樂  檸檬
0     1   4   2
1     2   9   5
2     3   2   8
     水果號碼	芭樂_x	香蕉	芭樂_y	檸檬 
0	1	7	6	4	2
1	2	4	2	9	5
import pandas as pd
df1=pd.DataFrame([[1,7,6],[2,4,2]],columns=['水果號碼','芭樂','香蕉',])
df2=pd.DataFrame([[1,4,2],[2,9,5],[3,2,8]],columns=['水果號碼','芭樂','檸檬'])
print(df1)
print(df2)
pd.merge(df1,df2,left_on='水果號碼', right_on='水果號碼',suffixes=['_1','_2'])


   水果號碼  芭樂  香蕉
0     1   7   6
1     2   4   2
   水果號碼  芭樂  檸檬
0     1   4   2
1     2   9   5
2     3   2   8
水果號碼	芭樂_1	香蕉	芭樂_2	檸檬
0	1	7	6	4	2
1	2	4	2	9	5

資料合併完成後,明天開始學習資料查看囉~ /images/emoticon/emoticon12.gif


上一篇
Day5- 資料處理(1)檔案存取
下一篇
Day7- 資料處理(3)空值處理
系列文
我與熊貓Pandas相處的日子30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言