搞懂Pandas數(shù)據(jù)合并,這一篇就夠了!
回復(fù)“書籍”即可獲贈Python從入門到進(jìn)階共10本電子書
數(shù)據(jù)合并是數(shù)據(jù)處理過程中的必經(jīng)環(huán)節(jié),pandas作為數(shù)據(jù)分析的利器,提供了四種常用的數(shù)據(jù)合并方式(concat,merge,append,join),讓我們看看如何使用這些方法吧!
1.concat()
concat() 可用于兩個(gè)及多個(gè) DataFrame 間行/列方向進(jìn)行內(nèi)聯(lián)或外聯(lián)拼接操作,默認(rèn)對行(沿 y 軸)取并集。
「使用方式」
pd.concat(
????objs:?Union[Iterable[~FrameOrSeries],?Mapping[Union[Hashable,?NoneType],?~FrameOrSeries]],
????axis=0,
????join='outer',
????ignore_index:?bool?=?False,
????keys=None,
????levels=None,
????names=None,
????verify_integrity:?bool?=?False,
????sort:?bool?=?False,
????copy:?bool?=?True,
)
「主要參數(shù)」
objs:一個(gè)序列或是Series,DataFrame對象的映射。axis:連接的軸,0('index',行),1('columns',列),默認(rèn)為0。join:連接方式 ,inner(交集), outer(并集),默認(rèn)為outer。ignore_index:是否重置串聯(lián)軸的索引值。如果為True,則重置索引為0,…, n - 1。keys:創(chuàng)建層次化索引??梢允侨我庵档牧斜砘驍?shù)組、元組數(shù)組、數(shù)組列表(如果將levels設(shè)置成多級數(shù)組的話)names:生成的分層索引中級別的名稱。
示例
創(chuàng)建兩個(gè) DataFrame。
df1?=?pd.DataFrame(
??????????{'char':?['a',?'b'],
???????????'num':?[1,?2]})
df2?=?pd.DataFrame(
??????????{'char':?['b',?'c'],
???????????'num':?[3,?4]})

concat() 默認(rèn)會對行方向進(jìn)行拼接操作,連接方式 outer。
pd.concat([d1,?d2])

清除現(xiàn)有索引并重置索引。
pd.concat(
????[d1,?d2],
????ignore_index=True)

通過 keys 參數(shù)在數(shù)據(jù)的最外層添加分層索引。
pd.concat(
????[d1,?d2],
????keys=['d1',?'d2'])

指定 names 參數(shù)來標(biāo)記創(chuàng)建的索引鍵。
pd.concat(
????[d1,?d1],
????keys=['d1',?'d2'],
????names=['DF?Name',?'Row?ID'])

將兩個(gè) DataFrame 與重疊的列進(jìn)行組合并返回所有內(nèi)容。交集外的列填充 NaN。
df3?=?pd.DataFrame(
??????????{'char':?['b',?'c'],
??????????'float':?[3.0,?4.0]})
pd.concat([df1,?df3])

將兩個(gè) DataFrame 與重疊的列進(jìn)行組合,只返回重疊列的內(nèi)容。
pd.concat(
????[df1,?df3],
????join="inner")

指定 axis=1 沿 x 軸水平組合 DataFrame 對象。
df4?=?pd.DataFrame(
??????????{'char':?['b',?'c',?'d'],
???????????'num':?[3,?4,?5]},
???????????index=range(1,?4))
pd.concat([df1,?df4],?axis=1)

2.merge()
merge() 只能用于兩個(gè) DataFrame 間列方向進(jìn)行內(nèi)聯(lián)或外聯(lián)合并操作,默認(rèn)列合并(沿 x 軸),取交集(即:以兩個(gè) DataFrame 列名的交集作為連接鍵)
「使用方式」
pd.merge(
????left,
????right,
????how:?str?=?'inner',
????on=None,
????left_on=None,
????right_on=None,
????left_index:?bool?=?False,
????right_index:?bool?=?False,
????sort:?bool?=?False,
????suffixes=('_x',?'_y'),
????copy:?bool?=?True,
????indicator:?bool?=?False,
????validate=None,
)
「參數(shù)」
left:DataFrameright:DataFrame 或者帶有 name 的Serieshow:{'left', 'right', 'outer', 'inner'}, 默認(rèn)為 'inner',連接的方式on:用于連接的列索引名稱,必須同時(shí)存在于左、右兩個(gè)DataFrame中,默認(rèn)是以兩個(gè)DataFrame列名的交集作為連接鍵。left_on:左側(cè)DataFrame中用于連接鍵的列名,這個(gè)參數(shù)在左右列名不同但代表的含義相同時(shí)非常有用;right_on:右側(cè)DataFrame中用于連接鍵的列名left_index:默認(rèn)為False,不使用左側(cè)DataFrame中的行索引作為連接鍵(但是這種情況下最好用JOIN)right_index:默認(rèn)為False,不使用右側(cè)DataFrame中的行索引作為連接鍵( 但是這種情況下最好用JOIN)sort:默認(rèn)為False,將合并的數(shù)據(jù)進(jìn)行排序,設(shè)置為False可以提高性能suffixes:字符串值組成的元組,用于指定當(dāng)左右DataFrame存在相同列名時(shí)在列名后面附加的后綴名稱,默認(rèn)為(’_x’, ‘_y’)copy:默認(rèn)為True,總是將數(shù)據(jù)復(fù)制到數(shù)據(jù)結(jié)構(gòu)中,設(shè)置為False可以提高性能indicator:顯示合并數(shù)據(jù)中數(shù)據(jù)的來源情況validate:{"one_to_one" or "1:1", "one_to_many" or "1:m", "many_to_one" or "m:1", "many_to_many" or "m:m"}如果指定,則檢查合并是否為指定類型。
示例
創(chuàng)建兩個(gè)DataFrame。
df1?=?pd.DataFrame(
??????????{'name':?['A1',?'B1',?'C1'],
???????????'grade':?[60,?70,?80]})
df2?=?pd.DataFrame(
??????????{'name':?['B1',?'C1',?'D1'],
???????????'grade':?[70,?80,?100]})

merge() 默認(rèn)情況下,會根據(jù)兩個(gè) DataFrame 中同時(shí)存在的列進(jìn)行合并,合并方法采用取交集的方式。
df1.merge(df2)

指定合并的方式為 outer,取并集。
df1.merge(df2,?how='outer')

下面再創(chuàng)建兩個(gè) DataFrame。
df1?=?pd.DataFrame(
??????{'name1':?['A1',?'B1',?'B1',?'C1'],
???????'grade':?[60,?70,?80,?90]})
df2?=?pd.DataFrame(
??????{'name2':?['B1',?'C1',?'D1',?'E1'],
???????'grade':?[70,?80,?90,?100]})

根據(jù) name1 和 name2 列合并 df1 和 df2。grade 列附加了默認(rèn)后綴 _x 和 _y。
df1.merge(
????df2,
????left_on='name1',
????right_on='name2')

合并 df1 和 df2,并將指定的左右后綴附加到重疊列末尾。
df1.merge(
????df2,
????left_on='name1',
????right_on='name2',
????suffixes=('_1',?'_2'))

3.append()
append() 可用于兩個(gè)及多個(gè) DataFrame 間行方向(沿 y 軸)的拼接操作,默認(rèn)取并集。
「使用方式」
df1.append(
????other,
????ignore_index=False,
????verify_integrity=False,
????sort=False)
「參數(shù)」
other: 指定要添加的數(shù)據(jù)。DataFrame 或 Series 對象,或這些對象的列表ignore_index: 是否忽略索引,如果為 True,軸將被重置為 0, 1, ..., n - 1。默認(rèn)為Falseverify_integrity:如果為 True,則在創(chuàng)建具有重復(fù)項(xiàng)的索引時(shí)引發(fā) ValueError。默認(rèn)為 Falsesort: 如果 df1 和 other 的列未對齊,則對列進(jìn)行排序。默認(rèn)為 False。
示例
創(chuàng)建兩個(gè) DataFrame。
df1?=?pd.DataFrame(
??????????[[1,?2],?[3,?4]],
??????????columns=list('AB'))
df2?=?pd.DataFrame(
??????????[[5,?6],?[7,?8]],
??????????columns=list('BC'))

append() 在默認(rèn)情況下會沿y軸垂直拼接兩個(gè) DataFrame ,df1,df2 交集外的列填充 NaN。
df1.append(df2)

將 ignore_index 設(shè)置為 True,來達(dá)到重置軸的索引。
df1.append(df2,?ignore_index=True)

4.join()
join() 用于兩個(gè)及多個(gè) DataFrame 間列方向(沿 x 軸)的拼接操作,默認(rèn)左拼接。
「使用方式」
df1.join(
????other,
????on=None,
????how='left',
????lsuffix='',
????rsuffix='',
????sort=False)
other:指定要添加的數(shù)據(jù)。DataFrame 或 Series 對象,或這些對象的列表on:連接的列,默認(rèn)使用索引連接how:{'left', 'right', 'outer', 'inner'}, 默認(rèn)為 'left',連接的方式lsuffix:默認(rèn)為空字符串,表示df1中重復(fù)列的后綴rsuffix:other中重復(fù)列的后綴sort:按照字典順序?qū)Y(jié)果在連接鍵上排序。如果為False,連接鍵的順序取決于連接類型(關(guān)鍵字)。
示例
創(chuàng)建兩個(gè) DataFrame。
df1?=?pd.DataFrame(
??????????{'A':?['A0',?'A1',?'A2',?'A3',?'A4'],
??????????'val':?['V0',?'V1',?'V2',?'V3',?'V4']})
df2?=?pd.DataFrame(
??????????{'B':?['B3',?'B4',?'B5'],
??????????'val':?['V3',?'V4',?'V5']})

如果我們想使用 val 列進(jìn)行連接,我們需要將 val 設(shè)置為 df1 和 df2 中的索引。
df1.set_index('val').join(
????df2.set_index('val'))

使用 val 列連接的另一個(gè)方法是指定 on 參數(shù)。df1.join 只能使用 df2 的索引,但可以使用 df1 中的任何列。所以可以只將 df2 中的 val 列轉(zhuǎn)為索引,并通過 on 參數(shù)指定 df1 的連接列為 val。
df1.join(
????df2.set_index('val'),
????on='val')

使用外連接的方式連接 df1,df2
df1.join(
????df2.set_index('val'),
????on='val',
????how='outer')

四種方法總結(jié)
concat()可沿任意軸連接Pandas對象,并且可在串聯(lián)軸上添加一層分層索引join()主要用于基于行索引進(jìn)行列的拼接merge()使用數(shù)據(jù)庫樣式的連接合并,連接是基于列或索引。一般情況下 append(),join()可以看成是concat()與merge()的簡易版,參數(shù)較少,易用性比較強(qiáng)。
“碼字不易!你的「點(diǎn)贊」、「分享」、「在看」、「收藏」是對我最大的支持!
”

小伙伴們,快快用實(shí)踐一下吧!如果在學(xué)習(xí)過程中,有遇到任何問題,歡迎加我好友,我拉你進(jìn)Python學(xué)習(xí)交流群共同探討學(xué)習(xí)。
-------------------?End?-------------------
往期精彩文章推薦:
Py自動化辦公—Word文檔替換、Excel表格讀取、Pdf文件生成和Email自動郵件發(fā)送實(shí)戰(zhàn)案例
手把手教你用Python腳本調(diào)用 DeepL API Pro 進(jìn)電子書的行進(jìn)行中英文自動翻譯
手把手教你用Python批量創(chuàng)建1-12月份的sheet表,每個(gè)表的第一行都有固定3個(gè)列標(biāo)題:A,B,C

歡迎大家點(diǎn)贊,留言,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持
想加入Python學(xué)習(xí)群請?jiān)诤笈_回復(fù)【入群】
萬水千山總是情,點(diǎn)個(gè)【在看】行不行
/今日留言主題/
隨便說一兩句吧~
