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 | 男 | 教授 | 彙編 |
謝謝大家的瀏覽,
希望我的努力能幫助到您,
共勉!