【Python數據分析】pandas中的Merge與join


1.Merge

Pandas具有全功能的,高性能內存中連接操作,與關系型數據庫中的連接操作類似。
語法:

pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,
         left_index=False, right_index=False, sort=True,
         suffixes=('_x', '_y'), copy=True, indicator=False)

1.1 簡單關聯:left_on與right_on

下面是Merge的一些實戰案例:
(1)創建測試數組

import pandas as pd
df1 = pd.DataFrame({'studentNo':['A01','A02','A03','A04'],
                   'studentName':['Jack','Lucy','Marry','Tom'],
                   'studentAge':[18,19,21,17],
                   'classNo':['class01','class02','class03','class02']
                   })
df2 = pd.DataFrame({'classNo':['class01','class02','class03','class04'],
                     'className':['火箭1班','火箭2班','火箭3班','火箭4班']
                     })

# 學生信息
print(df1)

# 班級信息
print(df2)

(2)使用Merge,找出每個學生對應的班級名字

print(pd.merge(df1, df2, on="classNo")) # 這里的df1類似關系型數據庫的主表,df2對應
# 如果存在多個鍵關聯,則on = ['key1','key2']

輸出結果:

1.2 使用how參數:指定連接方式

# 1.取交集:默認取交集
print('--------參數how = \'inner\'的結果--------------')  
print(pd.merge(df1, df2, on="classNo",how='inner'))  # 類似內連接
# 2.取並集,數據缺失則為NaN
print('--------參數how = \'outer\'的結果--------------')
print(pd.merge(df1, df2, on="classNo",how='outer')) # 類似全連接

# 3.左連接
print('--------參數how = \'left\'的結果--------------')
print(pd.merge(df1, df2, on="classNo",how='left')) 

# 4.右連接
print('--------參數how = \'right\'的結果--------------')
print(pd.merge(df1, df2, on="classNo",how='right'))  

1.3 right_index與right_index

import pandas as pd

df1 = pd.DataFrame({'left_key':list('abcd'),
                    'data1':range(4)})

df2 = pd.DataFrame({'right_key':list('acef'),
                    'data2':range(4)})
# df1 以‘lkey’為鍵,df2以'rkey'為鍵
print(pd.merge(df1,df2,left_on='left_key',right_on='right_key'))         

df1 = pd.DataFrame({'key':list('abcdfeg'),
                   'data1':range(7)})
df2 = pd.DataFrame({'data2':range(1,6)},
                  index = list('abcde'))
print('----------df1-------------')
print(df1)
print('----------df2-------------')
print(df2)
print('----------df1,df2,參數:left_on=\'key\',right_index=True-------------')
print(pd.merge(df1,df2,left_on='key',right_index=True)) 
# df1采用key列值作為關聯數據,df2采用index作為關聯數據
# left_index:為True時,第一個df以index為鍵,默認False
# right_index:為True時,第二個df以index為鍵,默認False

# 所以left_on, right_on, left_index, right_index可以相互組合

1.4 sort參數:排序

import pandas as pd
# 參數sort 
df1 = pd.DataFrame({'key':list('baecd'),
                   'data1':[10,2,4,7,5]})
df2 = pd.DataFrame({'key':list('abc'),
                    'data2':[11,2,33]})
print('-------------df1-------------')
print(df1)
print('-------------df2-------------')
print(df2)

y1 = pd.merge(df1,df2, on = 'key', how = 'outer')
y2 = pd.merge(df1,df2, on = 'key', sort=True, how = 'outer')
print('-------------df1與df2全連接的結果-------------')
print(y1)
print('-------------df1與df2全連接並根據連接鍵排序的結果-------------')
print(y2)
# sort:按照字典順序通過 連接鍵 對結果DataFrame進行排序。默認為False,設置為False會大幅提高性能
print('-------------df1與df2全連接的結果根據data1排序-------------')
# 也可以連接完畢后直接使用DataFrame的排序方法
print(y2.sort_values('data1'))

2.join

import pandas as pd
# pd.join 通過索引連接
left = pd.DataFrame({'A':['A01','A02','A03'],
                     'B':['B01','B02','B03']
                    },index=['k1','k2','k3'])

right = pd.DataFrame({'C':['C01','C02','C03','C04'],
                     'D':['D01','D02','D03','D04']
                    },index=['k1','k2','k3','k4'])

print(left,'-----------left-----------\n')
print(left,'-----------right-----------\n')
print(left.join(right),'-----------left.join(right)-----------\n')
print(left.join(right,how='outer'),'-----------left.join(right)-----------\n')
# 上述語句等價於 pd.merge(left, right, left_index=True, right_index=True, how='outer')

df1 = pd.DataFrame({'key':list('bbacde'),
                  'data1':[1,3,5,7,2,4]})

df2 = pd.DataFrame({'key':list('abc'),
                   'data2':[11,2,15]
                   })

print('-----------df1-----------')
print(df1)

print('-----------df2-----------')
print(df2)

# 指定參數suffixes
print('-' * 50)
print(pd.merge(df1, df2, left_index=True, right_index=True, suffixes=('_1', '_2')))  

# 用df1中的索引與df2['data2']中的索引連接
print('-' * 50)
# print(df2['data2'])
print(df1.join(df2['data2']))

left = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
                     'B': ['B0', 'B1', 'B2', 'B3'],
                     'key': ['K0', 'K1', 'K0', 'K1']})
right = pd.DataFrame({'C': ['C0', 'C1'],
                      'D': ['D0', 'D1']},
                     index=['K0', 'K1'])
print(left)
print(right)
print(left.join(right, on = 'key'))
# 等價於pd.merge(left, right, left_on='key', right_index=True, how='left', sort=False);
# left的‘key’和right的index

輸出結果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM