Pandas詳解二十之Merge、Join、Concat方式-詳解Pandas對象合併、連接

約定:
import pandas as pd

Merge-數據庫風格的合併

數據的合併(merge)和連接(join)是我們在數據分析和挖掘中不可或缺的,是通過一個或一個以上的鍵連接的。pandas的合併(merge)的的絕大功能和數據庫操作類似的。具有如下參數:

pd.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)

參數說明:

left、right:左右連接對象

how:連接方式,共有’inner’,’left’,right’,’outer’

on:根據連接的鍵

left_on、right_on:在連接的鍵名不同的情況下使用,left_on傳入左對象的鍵,right_on傳入右對象的鍵

left_index、right_index:設置索引是否作爲連接的鍵,通常 left_on=??和right_index=True, right_on=??和left_index=True,或者left_index=True和right_index=True

sort:對連接後的結果是否排序,當數據巨大的時候爲了追求效率可以設置爲False

suffixes:對於不作爲鍵的同名列,在其列名後添加的後綴

copy:將左右對象的內容複製過來,默認爲True

df1=pd.DataFrame({'名字':list('ABCDE'),'性別':['男','女','男','男','女'],'職稱':['副教授','講師','助教','教授','助教']},index=range(1001,1006))
df1.columns.name='學院老師'
df1.index.name='編號'
df1
代碼結果:
學院老師 名字 性別 職稱
編號
1001 A 副教授
1002 B 講師
1003 C 助教
1004 D 教授
1005 E 助教
df2=pd.DataFrame({'名字':list('ABDAX'),'課程':['C++','計算機導論','彙編','數據結構','馬克思原理'],'職稱':['副教授','講師','教授','副教授','講師']},index=[1001,1002,1004,1001,3001])
df2.columns.name='課程'
df2.index.name='編號'
df2
代碼結果:
課程 名字 職稱 課程
編號
1001 A 副教授 C++
1002 B 講師 計算機導論
1004 D 教授 彙編
1001 A 副教授 數據結構
3001 X 講師 馬克思原理

1 默認連接方式

默認下是根據左右對象中出現同名的列作爲連接的鍵,且連接方式是on=’inner’

pd.merge(df1,df2)
代碼結果:
名字 性別 職稱 課程
0 A 副教授 C++
1 A 副教授 數據結構
2 B 講師 計算機導論
3 D 教授 彙編

2 指定列名合併

pd.merge(df1,df2,on='名字')
代碼結果:
名字 性別 職稱_x 職稱_y 課程
0 A 副教授 副教授 C++
1 A 副教授 副教授 數據結構
2 B 講師 講師 計算機導論
3 D 教授 教授 彙編

3 其他連接方式:left/right/outer

關於連接方式不懂的可參考該博客:https://blog.csdn.net/plg17/article/details/78758593

pd.merge(df1,df2,how='left')
代碼結果:
名字 性別 職稱 課程
0 A 副教授 C++
1 A 副教授 數據結構
2 B 講師 計算機導論
3 C 助教 NaN
4 D 教授 彙編
5 E 助教 NaN
pd.merge(df1,df2,how='right')
代碼結果:
名字 性別 職稱 課程
0 A 副教授 C++
1 A 副教授 數據結構
2 B 講師 計算機導論
3 D 教授 彙編
4 X NaN 講師 馬克思原理
pd.merge(df1,df2,how='outer')
代碼結果:
名字 性別 職稱 課程
0 A 副教授 C++
1 A 副教授 數據結構
2 B 講師 計算機導論
3 C 助教 NaN
4 D 教授 彙編
5 E 助教 NaN
6 X NaN 講師 馬克思原理

4 根據多個鍵進行連接

pd.merge(df1,df2,on=['職稱','名字'])
代碼結果:
名字 性別 職稱 課程
0 A 副教授 C++
1 A 副教授 數據結構
2 B 講師 計算機導論
3 D 教授 彙編

5 對重複的列名處理

細心的你可能在上面的 2 觀察到了,不作爲連接鍵的相同列名更改了。那是因爲當不指定連接的鍵的時候是將‘名字’、‘職稱’作爲連接的鍵。

pd.merge(df1,df2,on='名字',suffixes=('_1','_2'))
代碼結果:
名字 性別 職稱_1 職稱_2 課程
0 A 副教授 副教授 C++
1 A 副教授 副教授 數據結構
2 B 講師 講師 計算機導論
3 D 教授 教授 彙編

6 將索引作爲連接的鍵

當我們連接時,無論是左右對象的索引都會被丟棄的。當們需要將索引作爲連接鍵時可以如下方式:

pd.merge(df1,df2,left_on='性別',right_index=True)
代碼結果:
名字_x 性別 職稱_x 名字_y 職稱_y 課程
編號
pd.merge(df1,df2,on=['名字','職稱'],left_index=True,right_index=True)
代碼結果:
名字 性別 職稱 課程
編號
1001 A 副教授 C++
1001 A 副教授 數據結構
1002 B 講師 計算機導論
1004 D 教授 彙編

對象的實例方法-Join

DataFrame對象有個df.join()方法也能進行pd.merge()的合併,它能更加方便地按照對象df的索引進行合併,且能同時合併多個DataFrame對象。它具有如下參數:

df.join(other, on=None, how=’left’, lsuffix=”, rsuffix=”, sort=False)

  • 創建對象
df3=pd.DataFrame({'Red':[1,3,5],'Green':[5,0,3]},index=list('abd'))
df3
代碼結果:
Green Red
a 5 1
b 0 3
d 3 5
df4=pd.DataFrame({'Blue':[1,9],'Yellow':[6,6]},index=list('ce'))
df4
代碼結果:
Blue Yellow
c 1 6
e 9 6

1 簡單合併(默認是left左連接)

df3.join(df4)
代碼結果:
Green Red Blue Yellow
a 5 1 NaN NaN
b 0 3 NaN NaN
d 3 5 NaN NaN

2 和merge合併方式一樣

df3.join(df4,how='outer')
代碼結果:
Green Red Blue Yellow
a 5.0 1.0 NaN NaN
b 0.0 3.0 NaN NaN
c NaN NaN 1.0 6.0
d 3.0 5.0 NaN NaN
e NaN NaN 9.0 6.0

3 合併多個DataFrame對象

df5=pd.DataFrame({'Brown':[3,4,5],'White':[1,1,2]},index=list('aed'))
df3.join([df4,df5])
代碼結果:
Green Red Blue Yellow Brown White
a 5 1 NaN NaN 3.0 1.0
b 0 3 NaN NaN NaN NaN
d 3 5 NaN NaN 5.0 2.0
df3.join([df4,df5],how='outer')
代碼結果:
Green Red Blue Yellow Brown White
a 5.0 1.0 NaN NaN 3.0 1.0
b 0.0 3.0 NaN NaN NaN NaN
c NaN NaN 1.0 6.0 NaN NaN
d 3.0 5.0 NaN NaN 5.0 2.0
e NaN NaN 9.0 6.0 4.0 1.0

軸向連接-Concat

在數據處理中,通常將原始數據分開幾個部分進行處理而得到相似結構的Series或DataFrame對象,我們該如何進行縱向合併它們?這時我們可以選擇用pd.concat()方式極易連接兩個或兩個以上的Series或DataFrame對象。如下是該函數的參數解讀:

pd.concat(objs, axis=0, join=’outer’, join_axes=None, ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, copy=True)

參數說明:

objs:連接對象,多以列表、字典傳入

axis:軸向,0代表縱向連接,1,代表橫向連接

join:連接方式,共有’inner’,’left’,right’,’outer’

join_axes:參與連接的索引

ignore_index:是否忽略索引

keys:層次化索引

1 Series對象的連接

s1=pd.Series([1,2],index=list('ab'))
s2=pd.Series([3,4,5],index=list('bde'))

pd.concat([s1,s2])

代碼結果:

a    1
b    2
b    3
d    4
e    5
dtype: int64

2 縱向連接

pd.concat([s1,s2],axis=1)
代碼結果:
0 1
a 1.0 NaN
b 2.0 3.0
d NaN 4.0
e NaN 5.0

3 用內連接求交集

pd.concat([s1,s2],axis=1,join='inner')
代碼結果:
0 1
b 2 3

4 指定部分索引進行連接

pd.concat([s1,s2],axis=1,join_axes=[list('abc')])
代碼結果:
0 1
a 1.0 NaN
b 2.0 3.0
c NaN NaN

5 創建層次化索引

pd.concat([s1,s2],keys=['A','B'])

代碼結果:

A  a    1
   b    2
B  b    3
   d    4
   e    5
dtype: int64

6 當縱向連接時keys爲列名

pd.concat([s1,s2],keys=['A','B'],axis=1)
代碼結果:
A B
a 1.0 NaN
b 2.0 3.0
d NaN 4.0
e NaN 5.0

7 DataFrame對象的連接

pd.concat([df3,df4],axis=1,keys=['A','B'])
代碼結果:
A B
Green Red Blue Yellow
a 5.0 1.0 NaN NaN
b 0.0 3.0 NaN NaN
c NaN NaN 1.0 6.0
d 3.0 5.0 NaN NaN
e NaN NaN 9.0 6.0

8 用字典的方式連接同樣可以創建層次化列索引

pd.concat({'A':df3,'B':df4},axis=1)
代碼結果:
A B
Green Red Blue Yellow
a 5.0 1.0 NaN NaN
b 0.0 3.0 NaN NaN
c NaN NaN 1.0 6.0
d 3.0 5.0 NaN NaN
e NaN NaN 9.0 6.0

9 忽略索引

pd.concat([df3,df4],ignore_index=True)
代碼結果:
Blue Green Red Yellow
0 NaN 5.0 1.0 NaN
1 NaN 0.0 3.0 NaN
2 NaN 3.0 5.0 NaN
3 1.0 NaN NaN 6.0
4 9.0 NaN NaN 6.0

謝謝大家的瀏覽,
希望我的努力能幫助到您,
共勉!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章