微信公衆號:「Python讀財」
若有問題或建議,請公衆號留言
爲了方便維護,通常公司的數據在數據庫內都是分表存儲的,好比用一個表存儲全部用戶的基本信息,一個表存儲用戶的消費狀況。因此,在平常的數據處理中,常常須要將兩張表拼接起來使用,這樣的操做對應到SQL中是join
,在Pandas中則是用merge
來實現。這篇文章就講一下merge
的主要原理。python
上面的引入部分說到merge
是用來拼接兩張表的,那麼拼接時天然就須要將用戶信息一一對應地進行拼接,因此進行拼接的兩張表須要有一個共同的識別用戶的鍵(key)。總結來講,整個merge
的過程就是將信息一一對應匹配的過程,下面介紹merge
的四種類型,分別爲'inner'
、'left'
、'right'
和'outer'
。數據庫
merge
的'inner'
的類型稱爲內鏈接,它在拼接的過程當中會取兩張表的鍵(key)的交集進行拼接。什麼意思呢?下面以圖解的方式來一步一步拆解。微信
首先咱們有如下的數據,左側和右側的數據分別表明了用戶的基礎信息和消費信息,鏈接兩張表的鍵是userid
。學習
如今用'inner'
的方式進行merge
spa
In [6]: df_1.merge(df_2,how='inner',on='userid') Out[6]: userid age payment 0 a 23 2000 1 c 32 3500
過程圖解:3d
①取兩張表的鍵的交集,這裏df_1
和df_2
的userid
的交集是{a,c}
code
②對應匹配blog
③結果rem
過程彙總:it
相信整個過程並不難理解,上面演示的是同一個鍵下,兩個表對應只有一條數據的狀況(一個用戶對應一條消費記錄),那麼,若是一個用戶對應了多條消費記錄的話,那又是怎麼拼接的呢?
假設如今的數據變成了下面這個樣子,在df_2
中,有兩條和a
對應的數據:
一樣用inner
的方式進行merge
:
In [12]: df_1.merge(df_2,how='inner',on='userid') Out[12]: userid age payment 0 a 23 2000 1 a 23 500 2 b 46 1000 3 c 32 3500
整個過程除了對應匹配階段,其餘和上面基本都是一致的。
過程圖解:
①取兩張表的鍵的交集,這裏df_1
和df_2
的userid
的交集是{a,b,c}
②對應匹配時,因爲這裏的a
有兩條對應的消費記錄,故在拼接時,會將用戶基礎信息表中a
對應的數據複製多一行來和右邊進行匹配。
③結果
'left'
和'right'
的merge
方式實際上是相似的,分別被稱爲左鏈接和右鏈接。這兩種方法是能夠互相轉換的,因此在這裏放在一塊兒介紹。
'left'
:merge
時,以左邊表格的鍵爲基準進行配對,若是左邊表格中的鍵在右邊不存在,則用缺失值NaN
填充。
'right'
:merge
時,以右邊表格的鍵爲基準進行配對,若是右邊表格中的鍵在左邊不存在,則用缺失值NaN
填充。
什麼意思呢?用一個例子來具體解釋一下,這是演示的數據
如今用'left'
的方式進行merge
In [21]: df_1.merge(df_2,how='left',on='userid') Out[21]: userid age payment 0 a 23 2000.0 1 b 46 NaN 2 c 32 3500.0 3 d 19 NaN
過程圖解:
①以左邊表格的全部鍵爲基準進行配對。圖中,由於右表中的e
不在左表中,故不會進行配對。
②若右表中的payment
列合併到左表中,對於沒有匹配值的用缺失值NaN
填充
過程彙總:
對於'right'
類型的merge
和'left'
實際上是差很少的,只要把兩個表格的位置調換一下,兩種方式返回的結果就是同樣的(),以下:
In [22]: df_2.merge(df_1,how='right',on='userid') Out[22]: userid payment age 0 a 2000.0 23 1 c 3500.0 32 2 b NaN 46 3 d NaN 19
至於'left'
和'right'
中(乃至於下面將介紹的'outer'
)鏈接的鍵是一對多的狀況,原理和上方的'inner'
是相似的,這裏便再也不贅述。
'outer'
是外鏈接,在拼接的過程當中它會取兩張表的鍵(key)的並集進行拼接。看文字不夠直觀,仍是上例子吧!
仍是使用上方用過的演示數據
此次使用'outer'
進行merge
In [24]: df_1.merge(df_2,how='outer',on='userid') Out[24]: userid age payment 0 a 23.0 2000.0 1 b 46.0 NaN 2 c 32.0 3500.0 3 d 19.0 NaN 4 e NaN 600.0
圖解以下:
①取兩張表鍵的並集,這裏是{a,b,c,d,e}
②將兩張表的數據列拼起來,對於沒有匹配到的地方,使用缺失值NaN
進行填充
能讀到這裏的小夥伴想必也基本理解了merge
的整個過程,總結來講,merge
的不一樣類型區別就在於拼接時,選用的兩個表格的鍵的集合不一樣。關於Pandas的merge
就介紹到這裏!
原創不易,若是以爲有點用,但願能夠隨手點個贊,拜謝各位老鐵。
掃碼關注公衆號「Python讀財」,第一時間獲取乾貨,還能夠加Python學習交流羣!!