數(shù)據(jù)分析——Pandas合并數(shù)據(jù),實(shí)現(xiàn)多表連接查詢

【導(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),加油。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容