merge()方法是Pandas中的合并操作,在數(shù)據(jù)處理過程中很常用,本文介紹merge()方法的具體用法。

merge(left, right): 將兩個(gè)DataFrame或Series合并到一起。left和right參數(shù)是必傳參數(shù),分別傳入一個(gè)DataFrame或Series對(duì)象,合并的順序與傳入的順序一致。從參數(shù)名left和right可以看出,merge()方法主要用于按列合并(橫向合并)。
merge()方法也可以實(shí)現(xiàn)按行合并(縱向)的效果,需要兩個(gè)DataFrame的列名完全一樣,且要指定合并方式為outer。

如果兩個(gè)DataFrame的列名完全相同,使用outer合并方式,效果是將兩個(gè)DataFrame按行合并到一起。merge()默認(rèn)的合并方式是inner(取交集),列名完全相同時(shí)取交集合并的結(jié)果是空DataFrame。
其實(shí),此時(shí)合并的原理也是按列合并,特殊的是兩個(gè)DataFrame中列名完全一樣,且沒有指定on參數(shù)。merge()方法自動(dòng)將所有列同時(shí)作為連接列,合并時(shí)取并集,所有的連接列在結(jié)果中都返回了,得到的效果就與按行合并一樣。(理解how參數(shù)和on參數(shù)后就會(huì)明白,下文馬上介紹)。

how: 指定合并時(shí)使用的連接方式,連接方式有四種,默認(rèn)為inner。| inner | 內(nèi)連 | 取key列的交集 |
| outer | 外連 | 取key列的并集 |
| left | 左連 | 使用左邊df的key列 |
| right | 右連 | 使用右邊df的key列 |

on: 指定合并時(shí)用于連接(外連,內(nèi)連,左連,右連)的列。默認(rèn)為None,merge()方法自動(dòng)識(shí)別兩個(gè)DataFrame中名字相同的列,作為連接的列,如本文前面的例子中沒有指定on參數(shù),也自動(dòng)識(shí)別了相同的列作為連接列。
合并時(shí),先找到兩個(gè)DataFrame中的連接列key,然后將第一個(gè)DataFrame中key列的每個(gè)值依次與第二個(gè)DataFrame中的key列進(jìn)行匹配,匹配到一次結(jié)果中就會(huì)有一行數(shù)據(jù)。上面的left和right中key列都是k0~k2,k0~k2分別匹配到一次,共匹配三次,所以結(jié)果有三行。假如將k0~k2都改成k,則left中的每一個(gè)k可以與right中的k匹配到三次(many_to_many,后面會(huì)介紹),共匹配9次,結(jié)果會(huì)有9行。on參數(shù)指定的列必須在兩個(gè)被合并DataFrame中都有,否則會(huì)報(bào)錯(cuò)。
on參數(shù)也可以指定多列,合并時(shí)按多個(gè)列進(jìn)行連接。
在合并時(shí),只有多個(gè)列的值同時(shí)相等,兩個(gè)DataFrame才會(huì)匹配上。上面的例子中,用于連接的列是key1,key2,k0,k0在兩個(gè)DataFrame中都有,匹配到一次,k1,k1匹配到兩次,k2,k2和k2,k3等都沒有匹配成功,所以結(jié)果為三行(默認(rèn)合并方式為inner)。
使用on參數(shù)時(shí),指定的列必須在兩個(gè)DataFrame中都有。merge()方法也支持兩個(gè)DataFrame分別指定連接的列,此時(shí)不要求指定列在兩個(gè)DataFrame中都有。
left_on: 指定第一個(gè)DataFrame中用于連接的列,默認(rèn)為None。right_on: 指定第二個(gè)DataFrame中用于連接的列,默認(rèn)為None。當(dāng)left_on和right_on都指定一樣的列時(shí),與用on參數(shù)的結(jié)果一樣。如果left_on和right_on指定不同的列,可能因?yàn)檫B接列的值匹配不上,結(jié)果是一個(gè)空DataFrame,將連接方式改成outer后才能得到非空的DataFrame。
left_on和right_on也可以指定一個(gè)array數(shù)組,長(zhǎng)度與DataFrame中的列長(zhǎng)度相等,連接原理不變。
left_index: 設(shè)置第一個(gè)DataFrame用行索引進(jìn)行連接,默認(rèn)為False。right_index: 設(shè)置第二個(gè)DataFrame用行索引進(jìn)行連接,默認(rèn)為False。left_on和right_on可以與left_index和right_index混合使用,當(dāng)指定了其中一個(gè)DataFrame的連接列時(shí),必須同時(shí)指定另一個(gè)DataFrame的連接列,否則會(huì)報(bào)錯(cuò)。兩個(gè)DataFrame都有兩種方式指定連接列,所以組合的方式有四種。| DataFrame | left | right |
四種指定連接列的組合 | left_on | right_on |
| left_index | right_index |
| left_on | right_index |
| left_index | right_on |

suffixes: 當(dāng)被合并的兩個(gè)DataFrame中有相同的列名時(shí),會(huì)給列名拼接后綴以作區(qū)分,默認(rèn)為('_x', '_y')。可以修改suffixes參數(shù)進(jìn)行設(shè)置,傳入長(zhǎng)度為2的字符串元組。

indicator: 在結(jié)果中增加一列,顯示連接列是否存在于兩個(gè)DataFrame中。indicator默認(rèn)為False,如果修改為True,會(huì)增加一列,增加的列名默認(rèn)為_merge。
給indicator參數(shù)指定一個(gè)值,則將這個(gè)值作為新增列的列名。在新增的列中,如果連接列同時(shí)存在于兩個(gè)DataFrame中,則對(duì)應(yīng)的值為both,如果連接列只存在其中一個(gè)DataFrame中,則對(duì)應(yīng)的值為left_only或right_only。
七連接列的對(duì)應(yīng)關(guān)系

validate: 用于指定兩個(gè)DataFrame連接列的對(duì)應(yīng)關(guān)系,有one_to_one(一對(duì)一),one_to_many(一對(duì)多),many_to_one(多對(duì)一),many_to_many(多對(duì)多)四種對(duì)應(yīng)方式。默認(rèn)為None,merge()方法自動(dòng)根據(jù)兩個(gè)DataFrame的連接列采用適合的對(duì)應(yīng)方式。
one_to_one: 檢查兩個(gè)DataFrame中的連接列,值必須唯一。
one_to_many: 檢查第一個(gè)DataFrame中的連接列,值必須唯一。
many_to_one: 檢查第二個(gè)DataFrame中的連接列,值必須唯一。
many_to_many: 兩個(gè)DataFrame連接列中的值都可以不唯一。
使用多對(duì)多的對(duì)應(yīng)方式,任何情況都滿足,合并不會(huì)報(bào)錯(cuò)。而使用其他三種方式時(shí),如果one對(duì)應(yīng)的DataFrame中連接列的值不唯一,會(huì)報(bào)錯(cuò)。所以,在對(duì)數(shù)據(jù)不夠了解、也沒有特別的對(duì)應(yīng)要求時(shí),不用指定validate參數(shù)。以上就是Pandas合并方法merge()的介紹,本文都是以DataFrame為例,Series合并以及Series與DataFrame合并的原理相似。如果需要本文代碼,可以點(diǎn)擊關(guān)注公眾號(hào)“Python碎片”,然后在后臺(tái)回復(fù)“pandas13”關(guān)鍵字獲取完整代碼。