




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第4章數(shù)據(jù)處理和分析-Pandas第10講數(shù)據(jù)的連接與合并Contents目錄01橫向合并縱向合并02重疊合并04主鍵合并0301橫向合并橫向合并參數(shù)名稱功能描述objs表示參與連接的對象,可以是一個序列,也可以是DataFrame或Series對象的映射。axis表示連接的軸向,0為行索引,1為列索引,默認(rèn)為0。join表示其他軸向上的索引是按交集(inner)還是并集(outer)進(jìn)行合并,默認(rèn)為outer。ignore_index表示是否保留連接軸上的索引,并產(chǎn)生0,1,…,n-1的新索引。默認(rèn)為False。keys表示用于連接軸上最外層的層次化索引,默認(rèn)為None。levels表示用于各級別的層次化索引,可以是序列對象的列表,默認(rèn)為None。names表示為keys和levels參數(shù)添加的多層次索引指定相應(yīng)的名稱,可以是列表對象,默認(rèn)為None。verify_integrity表示是否檢查新連接軸上的重復(fù)情況,如果發(fā)現(xiàn)則引發(fā)異常,默認(rèn)為False。sort如果參數(shù)join=”outer”,則非連接軸在“聯(lián)接”時尚未對齊,則對其進(jìn)行排序;join=”inner”時,則不排序。默認(rèn)為False。copy表示是否復(fù)制數(shù)據(jù),默認(rèn)為True。又稱橫向堆疊,是將兩個數(shù)據(jù)子集在X軸方向進(jìn)行拼接,即保持行對齊,合并各列的數(shù)據(jù),以生成一個新的數(shù)據(jù)集。橫向合并,大多使用pandas.concat()函數(shù)完成,該函數(shù)的基本語法:concat(objs,axis=0,join='outer',ignore_index=False,keys=None,levels=None,names=None,verify_integrity=False,sort=False,copy=True)橫向合并當(dāng)函數(shù)concat()的參數(shù)axis=1時,可以對數(shù)據(jù)進(jìn)行行對齊,然后將不同列索引的兩個或多個數(shù)據(jù)子集進(jìn)行橫向合并。(1) 當(dāng)兩個表索引不完全一樣時,可以使用join參數(shù)選擇是內(nèi)連接還是外連接。join=”inner”時,僅返回索引重疊部分,join=”outer”時,則顯示索引的并集部分?jǐn)?shù)據(jù),不足的地方則使用空值填補(bǔ),其原理如下圖。(2) 當(dāng)兩張表完全一樣時,不論join參數(shù)取值是inner或者outer,結(jié)果都是將兩個表完全按照X軸拼接起來。橫向合并橫向合并示例>>>df1=pd.DataFrame({'letter':['a','b'],'number':[1,2]})>>>df4=pd.DataFrame([['bird','polly'],['monkey','george']],columns=['animal','name'])>>>pd.concat([df1,df4],axis=1)#按列方向合并數(shù)據(jù)
letter number animal name0 a 1 bird polly1 b 2 monkey george02縱向合并縱向合并又稱縱向堆疊,是將數(shù)據(jù)子集按照Y軸方向進(jìn)行拼接,即保持列對齊,合并各行的數(shù)據(jù),以生成一個新的數(shù)據(jù)集。1.使用concat()函數(shù)使用concat()函數(shù)時,在默認(rèn)情況下,即axis=0時,concat做列對齊,將不同行索引的兩張或多張表縱向合并。(1)在兩張表的列名并不完全相同的情況下,當(dāng)join參數(shù)取值為inner時,返回的僅僅是列名交集所代表的列,取值為outer時,返回的是兩者列名的并集所代表的列,其原理如右圖。(2)不論join參數(shù)取值是inner或者outer,結(jié)果都是將兩個表完全按照Y軸拼接起來??v向合并使用concat()函數(shù)進(jìn)行縱向合并示例>>>s1=pd.Series(['a','b'])#創(chuàng)建Series對象>>>s2=pd.Series(['c','d'])>>>pd.concat([s1,s2])#橫向堆疊,返回一個新的Series對象>>>pd.concat([s1,s2],ignore_index=True)#忽略原索引,自動創(chuàng)建新索引>>>pd.concat([s1,s2],keys=['s1','s2'])#合并時創(chuàng)建分層索引,并定義外層索引的值>>>pd.concat([s1,s2],keys=['s1','s2'],names=['ObjName','RowIdx'])#定義各層索引的名稱>>>df1=pd.DataFrame([['a',1],['b',2]],columns=['letter','number'])#創(chuàng)建DataFrame對象>>>df2=pd.DataFrame([['c',3],['d',4]],columns=['letter','number'])>>>pd.concat([df1,df2])#橫向連接,保持原對象索引>>>df3=pd.DataFrame([['c',3,'cat'],['d',4,'dog']],columns=['letter','number','animal'])>>>pd.concat([df1,df3],sort=False)#連接時不改變列索引的順序>>>pd.concat([df1,df3],join="inner")#以交集方式合并數(shù)據(jù)>>>df5=pd.DataFrame([1],index=['a'])>>>df6=pd.DataFrame([2],index=['a'])>>>pd.concat([df5,df6],verify_integrity=True)#合并時不允許索引重復(fù),否則報錯縱向合并2.使用append()函數(shù)數(shù)據(jù)子集的縱向堆疊,也可以使用DataFrame.append()方法,但append()方法實現(xiàn)縱向堆疊的前提條件是兩個數(shù)據(jù)子集的列名需要完全一致。append()方法的基本語法如下:append(other,ignore_index=False,verify_integrity=False,sort=False)參數(shù)名稱功能描述other表示要添加的新數(shù)據(jù)子集ignore_indexbool值,為True時會自動產(chǎn)生新索引,并忽略原數(shù)據(jù)的索引。默認(rèn)為Falseverify_integritybool值,若為True且ignore_idnex為False時,則檢查添加的索引是否沖突。若索引沖突,則添加數(shù)據(jù)失敗。默認(rèn)為False。sortbool值,若為True,在合并的數(shù)據(jù)子集列索引沒有對齊時,則按列排序。默認(rèn)為False??v向合并使用append()函數(shù)進(jìn)行縱向合并示例>>>df1=pd.DataFrame([[1,2],[3,4]],columns=list('AB'))>>>df1AB012134>>>df2=pd.DataFrame([[5,6],[7,8]],columns=list('AB'))>>>df2AB0561 78>>>df1.append(df2,ignore_index=True)#縱向合并,忽略原數(shù)據(jù)索引
AB01213425637803主鍵合并主鍵合并主鍵合并,類似于關(guān)系數(shù)據(jù)庫的join方式,即通過一個或多個鍵將不同數(shù)據(jù)集的行連接起來。針對同一個主鍵存在兩個包含不同列名的表,將其根據(jù)某幾個列關(guān)鍵字一一對應(yīng)拼接起來,結(jié)果集列數(shù)為兩個原數(shù)據(jù)集的列數(shù)之和減去用于連接鍵的數(shù)量。例如,按照主鍵Key進(jìn)行數(shù)據(jù)合并,結(jié)果如下圖。主鍵合并1.使用merge()函數(shù)merge()函數(shù)的基本語法如下:merge(left,right,how='inner',on=None,left_on=None,right_on=None,left_index=False,right_index=False,sort=False,suffixes=('_x','_y'),copy=True,indicator=False,validate=None)參數(shù)名稱功能描述left用于合并的DataFrame對象right用于合并的DataFrame對象或命名的Series對象how設(shè)置數(shù)據(jù)合并時的連接方式,可以為”left”、”right”、”inner”、”outer”四種類型,默認(rèn)為”inner”on用于連接的列或索引級別的名稱或其列表,必須同時在左、右兩個DataFrame中存在。若為列或索引級別名稱的列表,則表示多鍵連接,默認(rèn)以兩個DataFrame列名的交集作為連接鍵。left_on表示左側(cè)DataFrame作為連接鍵的列或索引級別名稱??梢允橇忻?shù)組或與左側(cè)DataFrame長度相等的數(shù)組的列表。right_on表示右側(cè)DataFrame作為連接鍵的列或索引級別名稱,同left_on。left_indexbool型,默認(rèn)為False,表示是否使用left_on參數(shù)指定的行索引作為連接鍵。right_indexbool型,默認(rèn)為False,同left_index。sortbool型,默認(rèn)為False,表示是否對合并的數(shù)據(jù)按主鍵的字典順序排序。suffixes字符串組成的元組,用于指定左、右DataFrame列名重復(fù)時再列名后面附加的后綴名稱,默認(rèn)為(’_x’,’_y’)。copybool型,表示是否將數(shù)據(jù)復(fù)制到數(shù)據(jù)結(jié)構(gòu),默認(rèn)為False。indicatorbool或str類型,默認(rèn)為False。若為True,則在輸出的DataFrame中增加一個名為“_merge”的列,指示每一行的來源信息;若為str類型,則輸出的DataFrame中增加的列信息為分類類型,可以為“l(fā)eft_only”、“right_only”和“both”,表明每一行的來源是否與參與合并的左右兩側(cè)的DataFrame有關(guān)。validatestr類型,可選項。用于檢查數(shù)據(jù)合并時的聯(lián)結(jié)類型,可以為“1:1”、“1:m”、“m:m”,即一對一、一對多、多對多的聯(lián)結(jié)類型。主鍵合并(1)內(nèi)連接:how=’inner’,使用兩個表都有的鍵值,返回兩個表的交集,即將左表與右表中鍵值相同的行進(jìn)行匹配,鍵值不同的行將被舍棄。若左表和右表中沒有鍵值相同的行存在,將返回一個空的數(shù)據(jù)集。(2)左連接:how=’left’,使用左表中所有的鍵值,將左表的所有行與右表中鍵值相同的行進(jìn)行匹配。若右表中沒有匹配的行,則其值為“NaN”;(3)右連接:how=’right’,使用右表中所有的鍵值,將右表的所有行與左表中鍵值相同的行進(jìn)行匹配。若左表中沒有匹配的行,則其值為“NaN”;(4)外連接:how=’outer’,使用兩個表中所有的鍵值,返回兩個表的并集??梢詫⑼膺B接理解為是左連接和右連接的組合。使用merge()函數(shù)按主鍵進(jìn)行數(shù)據(jù)合并時,只能同時合并兩個數(shù)據(jù)子集,且合并后的數(shù)據(jù)集的列數(shù)為兩個原數(shù)據(jù)子集的列數(shù)之和減去連接主鍵的個數(shù)。為方便起見,分別把兩個數(shù)據(jù)子集稱為左表和右表。其中的how參數(shù)可以用來設(shè)置左表和右表的連接方式,說明如下:主鍵合并(1)一對一:鍵值沒有重復(fù)。左表與右表的鍵值存在一一對應(yīng)的關(guān)系,連接后的結(jié)果集其行數(shù)為左表或右表的行數(shù)。(2)多對一:左表中的鍵值不唯一,存在重復(fù),而右表中的鍵值唯一。連接時保留重復(fù)行,其結(jié)果集行數(shù)為左表的行數(shù)。(3)多對多:左表和右表的鍵值均不唯一。連接后的結(jié)果集為左表和右表中行的笛卡爾積,其行數(shù)為兩個表行數(shù)的乘積。在將兩個表按照主鍵進(jìn)行連接時,類似于關(guān)系型數(shù)據(jù)庫,表之間存在數(shù)據(jù)的一對一、多對一、多對多的關(guān)系,這也會影響連接的結(jié)果集數(shù)據(jù)的多少。主鍵合并使用merge()函數(shù)進(jìn)行主鍵合并示例>>>left=pd.DataFrame({'Name':['Jobs','BillGates','Beckham'],
'Identity':['AppleInc.','Microsoft','Athlete']})>>>right=pd.DataFrame({'Name':['Jobs','BillGates','Beckham'],'Visited':[23.7,57.8,46.2]})
merge(left,right)
按主鍵合并數(shù)據(jù)
NameIdentity0JobsAppleInc.1BillGatesMicrosoft2BeckhamAthlete
NameVisited0Jobs23.71BillGates57.82Beckham46.2
NameIdentityVisited0JobsAppleInc.23.71BillGatesMicrosoft57.82BeckhamAthlete46.2采用默認(rèn)方式,按鍵相同合并兩個表left、right,且連接的方式為內(nèi)連接,相當(dāng)于參數(shù)on=”Name”、how=”inner”的情況。同時,兩個表之間的聯(lián)系是一對一的關(guān)系,無論采用哪一種連接方式,其結(jié)果是一樣的。主鍵合并使用merge()函數(shù)進(jìn)行主鍵合并示例>>>df1=pd.DataFrame({'lkey':['b','b','a','c','a','a','b'],'data1':range(7)})>>>df2=pd.DataFrame({'rkey':['a','b','d'],'data2':range(3)})merge(df1,df2,left_on='lkey',right_on='rkey')合并兩個數(shù)據(jù)兩個表的連接主鍵名稱不同,但數(shù)據(jù)含義一致,可使用left_on、right_on參數(shù)分別指定連接時的主鍵。同時,兩個表數(shù)據(jù)之間的聯(lián)系呈現(xiàn)出多對一的關(guān)系,且數(shù)據(jù)的連接方式為內(nèi)連接(inner)。因此,左表中鍵值為a和b的每一行將分別關(guān)聯(lián)右表中對應(yīng)的唯一一行。
lkeydata10b01b12a23c34a45a56b6
rkeydata20a01b12d2
lkeydata1rkeydata20b0b11b1b12b6b13a2a04a4a05a5a0主鍵合并使用merge()函數(shù)進(jìn)行主鍵合并示例>>>df1=pd.DataFrame({'key':['b','b','a','c','a','b'],'data1':np.random.randint(0,100,6)})>>>df2=pd.DataFrame({'key':['a','b','a','b','d'],'data2':np.random.randint(0,100,5)})merge(df1,df2,on='key',how='left')按左連接方式合并數(shù)據(jù)按主鍵key連接兩個表,連接的方式為左連接(left),且數(shù)據(jù)之間的聯(lián)系為多對多的關(guān)系。因此,左表中的每一行將分別關(guān)聯(lián)右表中對應(yīng)鍵值的每一行,若左表中的鍵值在右表中不存在時,對應(yīng)的鍵值將置為NaN(如左表中的c),而右表中的鍵值在左表中不存在時將被舍棄。
keydata10b671b472a83c544a865b17
keydata20a431b432a53b454d62
keydata1data20b6743.01b6745.02b4743.03b4745.04a843.05a85.06c54NaN7a8643.08a865.09b1743.010b1745.0主鍵合并使用merge()函數(shù)進(jìn)行主鍵合并示例>>>left=pd.DataFrame({'key1':['foo','foo','bar'],'key2':['one','two','one'],'lval':[1,2,3]})>>>right=pd.DataFrame({'key1':['foo','foo','bar','bar'],
'key2':['one','one','one','two'],'rval':[4,5,6,7]})merge(left,right,on=['key1','key2'],how='outer')按多個鍵外連接按多個鍵連接合并數(shù)據(jù),可將多個鍵看作為一個元組,按單個鍵的連接方式處理。同時,兩個表數(shù)據(jù)之間的聯(lián)系為多對多的關(guān)系,將連接產(chǎn)生行的笛卡爾積,即數(shù)據(jù)合并的結(jié)果,其行數(shù)為左表的行數(shù)與右表行數(shù)的乘積。
key1key2lval0fooone11footwo22barone3
key1key2rval0fooone41fooone52barone63bartwo7
key1key2lvalrval0fooone1.04.01fooone1.05.02footwo2.0NaN3barone3.06.04bartwoNaN7.0主鍵合并2.使用join()函數(shù)使用join()方法實現(xiàn)按主鍵合并時,要求兩個數(shù)據(jù)子集的主鍵名稱必須相同。join()方法也可以實現(xiàn)按行索引合并數(shù)據(jù)的功能。join()方法的語法如下:join(other,on=None,how='left',lsuffix='',rsuffix='',sort=False)參數(shù)名稱功能描述other表示要合并的數(shù)據(jù)集,可以是DataFrame、Series或DataFrame的列表。on設(shè)置要連接的主鍵,可以是列名或者列名的列表或元組,默認(rèn)為None。how用于設(shè)置連接的方式,可以為”inner”、”outer”、”left”、”right”,同merge函數(shù),默認(rèn)為”inner”。lsuffixstring類型,表示用于追加到左側(cè)重疊列名末尾的后綴名稱。rsuffixstring類型,表示用于追加到右側(cè)重疊列名末尾的后綴名稱。sortbool類型,表示是否根據(jù)連接鍵對合并后的數(shù)據(jù)進(jìn)行排序,默認(rèn)為True。說明:當(dāng)需要join的數(shù)據(jù)是DataFrame對象的列表時,不支持傳遞參數(shù)on,lsuffix,sort。主鍵合并使用join()函數(shù)進(jìn)行主鍵合并示例>>>df=pd.DataFrame({'key':['K0','K1','K2','K3','K4','K5'],'A':['A0','A1','A2','A3','A4','A5']})>>>other=pd.DataFrame({'key':['K0','K1','K2'],'B':['B0','B1','B2']})df.join(other,lsuffix='_caller',rsuffix='_other')按行索引進(jìn)行連接join()方法默認(rèn)按行索引進(jìn)行數(shù)據(jù)合并,且連接方式為左連接(left)。當(dāng)主鍵名稱相同時,可以通過參數(shù)lsuffix和rsuffix指定主鍵具有不同的后綴名稱。
keyA0K0A01K1A12K2A23K3A34K4A45K5A5
keyB0K0B01K1B12K2B2
key_callerAkey_otherB0K0A0K0B01K1A1K1B12K2A2K2B23K3A3NaNNaN4K4A4NaNNaN5K5A5NaNNaN主鍵合并使用join()函數(shù)進(jìn)行主鍵合并示例>>>df=pd.DataFrame({'key':['K0','K1','K2','K3','K4','K5'],'A':['A0','A1','A2','A3','A4','A5']})>>>other=pd.DataFrame({'key':['K0','K1','K2'],'B':['B0','B1','B2']})df.set_index('key').join(other.set_index('key'))按指定的列連接使用DataFrame對象的join()方法按主鍵方式進(jìn)行列-列合并,需要先將兩個表中要作為主鍵的列設(shè)置為索引,然后再進(jìn)行連接。此時,連接的結(jié)果中索引也是指定的列。
keyA0K0A01K1A12K2A23K3A34K4A45K5A5
keyB0K0B01K1B12K2B2
ABkey
K0A0B0K1A1B1K2A2B2K3A3NaNK4A4NaNK5A5NaN主鍵合并使用
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 叉車臺班合同范本
- 音樂課程合同范本
- 清運(yùn)泥土合同范本
- 口腔護(hù)士合同范本簡易
- 醫(yī)院工傷協(xié)作合同范本
- 臺球俱樂部合同范本
- 兄弟合作合同范本
- 合同9人合作合同范本
- 買本田新車合同范本
- 產(chǎn)地供應(yīng)合同范本
- 道路施工導(dǎo)改及施工方案
- 《實數(shù)》單元作業(yè)設(shè)計
- 攝影基礎(chǔ)知識教學(xué)課件-攝影師入門基礎(chǔ)知識
- 煙花爆竹基礎(chǔ)知識
- 路橋過渡段主要技術(shù)標(biāo)準(zhǔn)與結(jié)構(gòu)
- 互聯(lián)網(wǎng)公司勞動合同
- 吉美版四年級綜合實踐活動下冊全冊表格簡約式教案教學(xué)設(shè)計
- 通信工程監(jiān)理實施細(xì)則
- 電力變壓器監(jiān)造規(guī)范(完整版)資料
- 精品課程:運(yùn)動訓(xùn)練學(xué)(北京體育大學(xué))
- 改革開放30年文化體制改革評述
評論
0/150
提交評論