【導(dǎo)語】 學(xué)過Excel和MySQL,Pandas后,你會(huì)發(fā)現(xiàn)它們的都能處理數(shù)據(jù),只是實(shí)現(xiàn)方式不同罷了,互相能起到互補(bǔ)的作用。那么,在工作中,工具沒有好壞之分,只要能解決問題,都是好工具,關(guān)鍵是我們?cè)趺从谩D敲幢酒恼拢饕偨Y(jié)在python中如何合并數(shù)據(jù),如何利用pandas實(shí)現(xiàn)多表連接查詢。
一、Pandas合并數(shù)據(jù)
1、concat()
我們可以通過DataFrame或Series類型的concat方法,來進(jìn)行連接操作,連接時(shí),會(huì)根據(jù)索引進(jìn)行對(duì)齊。
- axis:指定連接軸,默認(rèn)為0(上下);1(左右)【axis=0/1】
-
join:指定連接方式,默認(rèn)為外連接。【join='outer':并集,join='inner':交集】
- keys:可以用來區(qū)分不同的數(shù)據(jù)組,形成層級(jí)索引,如:【keys=["df1","df2"])】
- join_axes:指定連接結(jié)果集中保留的索引。默認(rèn)全部保留,如:【join_axes=[df1.columns]】
- ignore_index:忽略原來連接的索引,創(chuàng)建新的整數(shù)序列索引,默認(rèn)為False
- sort:concat之后,是否按照列索引排序,sort=True/False
df1=pd.DataFrame({"date":[2015,2016,2017,2018,2019],"x1":[2000,3000,5000,8000,10000],"x2":[np.nan,"d","d","c","c"]})
df2=pd.DataFrame({'date':[2017,2018,2019,2020],"y1":[1000,2000,3000,2000]})
# display(df1,df2)
df3=pd.concat([df1,df2],keys=["df1","df2"])
display(df3)
#索引層級(jí)索引元素時(shí),先外再內(nèi)
df3.loc["df2",3].loc["y1"]
2、merge()
通過pandas或DataFrame的merge方法,可以進(jìn)行兩個(gè)DataFrame的連接,這種連接類似于SQL中對(duì)兩張表進(jìn)行的join連接。
-
how:指定連接方式。可以是inner, outer, left, right,默認(rèn)為inner。
- on:指定連接使用的列(該列必須同時(shí)出現(xiàn)在兩個(gè)DataFrame中,如果指定兩個(gè)不同列名,可用left_on/right_on),默認(rèn)使用兩個(gè)DataFrame中的所有同名列進(jìn)行連接。
- left_index / right_index:是否將左邊(右邊)DataFrame中的索引作為連接列,默認(rèn)為False。
- suffixes:當(dāng)兩個(gè)DataFrame列名相同時(shí),指定每個(gè)列名的后綴(用來區(qū)分),默認(rèn)為x與y。
df1=pd.DataFrame({"date":[2015,2016,2017,2018,2019],"x1":[2000,3000,5000,8000,10000],"x2":[np.nan,"d","d","c","c"]})
df2=pd.DataFrame({'date':[2017,2018,2019,2020],"y1":[1000,2000,3000,2000]})
# display(df1,df2)
df3=df1.merge(df2,on="date")
display(df3)
df1=pd.DataFrame({"date":[2015,2016,2017,2018,2019],"x1":[2000,3000,5000,8000,10000],"x2":[np.nan,"d","d","c","c"]})
df2=pd.DataFrame({'date':[2017,2018,2019,2020],"y1":[1000,2000,3000,2000]})
# display(df1,df2)
df3=df1.merge(df2,how='left',on="date")
display(df3)
二、Python合并數(shù)據(jù)
1、append
在對(duì)行進(jìn)行連接時(shí),也可以使用Series或DataFrame的append方法。append是concat的簡略形式,只不過只能在axis=0上進(jìn)行合并。
df1=pd.DataFrame({"date":[2015,2016,2017,2018,2019],"x1":[2000,3000,5000,8000,10000],"x2":[np.nan,"d","d","c","c"]})
df2=pd.DataFrame({'date':[2017,2018,2019,2020],"y1":[1000,2000,3000,2000]})
# display(df1,df2)
df3=df1.append(df2)
display(df3)
2、join
與merge方法類似,但是默認(rèn)使用索引進(jìn)行連接。
- how:指定連接方式。可以是inner, outer, left, right,默認(rèn)為left。
- on:設(shè)置當(dāng)前DataFrame對(duì)象使用哪個(gè)列與參數(shù)對(duì)象的索引進(jìn)行連接。
- lsuffix / rsuffix:當(dāng)兩個(gè)DataFrame列名相同時(shí),指定每個(gè)列名的后綴(用來區(qū)分),如果不指定,列名相同會(huì)產(chǎn)生錯(cuò)誤。
- join與merge類似,都是進(jìn)行兩張表的連接。
不同點(diǎn):
- merge默認(rèn)進(jìn)行的內(nèi)連接(inner),join默認(rèn)進(jìn)行的左外連接(left)。
- 當(dāng)出現(xiàn)同名字段(列索引)時(shí),merge可以自動(dòng)補(bǔ)后綴(_x, _y),但是join不會(huì)自動(dòng)補(bǔ)后綴,而是會(huì)產(chǎn)生錯(cuò)誤。
- merge默認(rèn)使用同名的列進(jìn)行等值連接。join默認(rèn)使用左右兩表的索引進(jìn)行連接。
- merge中on參數(shù),指定兩張表中共同的字段,而join中on參數(shù),僅指定左表中的字段(右表依然使用索引)。
- merge與join側(cè)重點(diǎn)不同,merge側(cè)重的是使用字段進(jìn)行連接,而join側(cè)重的是使用索引進(jìn)行連接。
df1=pd.DataFrame({"date":[2015,2016,2017,2018,2019],"x1":[2000,3000,5000,8000,10000],"x2":[np.nan,"d","d","c","c"]})
df2=pd.DataFrame({'date':[2017,2018,2019,2020],"y1":[1000,2000,3000,2000]})
# display(df1,df2)
df3=df1.join(df2,how='left',lsuffix='_x',rsuffix='_y')
#根據(jù)索引對(duì)齊
display(df3)
希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,每天進(jìn)步一點(diǎn)點(diǎn),加油。