pandas 連接合並merge、join、concat


 三者都可以進行數據合並和拼接,但具體連接方式不同: 

1、merge

2、join

3、concat

一、merge

默認是根據列標題進行合並

1、在一個字段上的連接

import numpy as np
from pandas import Series, DataFrame

dframe1 = DataFrame({'key':['X','Z','Y','Z','X','X'],'value_df1': np.arange(6)})
dframe1
>>
    key  value_df1
0    X    0
1    Z    1
2    Y    2
3    Z    3
4    X    4
5    X    5


dframe2 = DataFrame({'key':['Q','Y','Z'],'value_df2':[1,2,3]})
dframe2
>>
    key  value_df2
0    Q    1
1    Y    2
2    Z    3

1)內連接(交集)

# 默認選取兩個數據共有的字段進行連接
# 默認是內連接(即交集)
pd.merge(dframe1,dframe2)

# 功能同上
pd.merge(dframe1,dframe2, on='key', how='inner')  # on='key'指定合並的字段;how='inner'指定連接方式為內連接
>> 

選取‘key’列數據取交集后,另外兩列的數據組合連接成一行:
比如上數據,df1中Z有兩行數據(1, 3),df2中Z有一行數據(3),最后將(1-3, 3-3)連接生成2行數據,得到以上的數據結果。
因為df1和df2中Y都只有一行,所以最終連接后也只有一行數據。

2)外連接(全連接、並集)

# on='key'可以省略,但最好不要省略
# how='outer'指定外連接
pd.merge(dframe1,dframe2,on='key',how='outer')
>>

可以看到,df2中沒有的df1中有的X,在df2的數據中自動填充了空值NaN。df1中也相同。

3)左連接

# 對左邊on='×'列的數據進行鏈接,右邊沒有的,用NaN進行填充
pd.merge(dframe1,dframe2,on='key',how='left')
>>

 可以看出,key只有左邊數據的數據,在右邊數據沒有的,就用空值填充。

4)右連接

# 與左連接相反。以右邊數據為基准,左邊沒有的用空值填充
pd.merge(dframe1,dframe2,on='key',how='right')
>>

 2、在多個字段上的連接

# 定義兩個DataFrame數據
df_left = DataFrame({'key1': ['SF', 'SF', 'LA'],
                  'key2': ['one', 'two', 'one'],
                  'left_data': [10,20,30]})
df_left
>>
key1    key2    left_data
0    SF    one    10
1    SF    two    20
2    LA    one    30



df_right = DataFrame({'key1': ['SF', 'SF', 'LA', 'LA'],
                   'key2': ['one', 'one', 'one', 'two'],
                   'right_data': [40,50,60,70]})
df_right
>>
key1    key2    right_data
0    SF    one    40
1    SF    one    50
2    LA    one    60
3    LA    two    70

1)內連接

# 指定同時在多個字段上連接
pd.merge(df_left, df_right, on=['key1', 'key2'])  

 2)外連接

# 指定how='outer'
pd.merge(df_left, df_right, on=['key1', 'key2'],how='outer')

 3)若兩列中有多個相同名稱字段,且只在一個字段上了連接

# 只對key1連接,key2會自動重命名
pd.merge(df_left,df_right,on='key1')
>>

# 當然也可以給key2字段分別加后綴
pd.merge(df_left,df_right, on='key1',suffixes=('_lefty','_righty'))
>>

 3)左連接

# 指定how='left'
pd.merge(df_left, df_right, on=['key1', 'key2'],how='left')
>>

 4)右連接

# 指定how='right'
pd.merge(df_left, df_right, on=['key1', 'key2'],how='right')
>>

 3、merge在index上的應用

# 定義兩個數據:
# 一個數據是'key'列數據是X, Y, Z
# 一個是索引數據為X, Y, Z
df_left = DataFrame({'key': ['X','Y','Z','X','Y'], 'data': range(5)}) df_left >> key data 0 X 0 1 Y 1 2 Z 2 3 X 3 4 Y 4 df_right = DataFrame({'group_data': [10, 20]}, index=['X', 'Y']) # 定義數據的索引為X, Y df_right >> group_data
X 10
Y 20

1)left_on, right_on

# 兩邊可以分別選擇不一樣字段的數據進行連接
# 通過left_on指定左邊字段,right_on指定右邊字段
pd.merge(df_left,df_left,left_on='key',right_on='key')
>>

 2)left_on, right_index

# 指定左邊數據的'key'列,並且將左邊數據的索引用於右邊。
# 默認是內連接
pd.merge(df_left,df_right,left_on='key',right_index=True) >>

# 外連接
pd.merge(df_left,df_right,left_on='key',right_index=True, how='outer')
>>

 左連接、右連接類似

pd.merge(df_left,df_right,left_on='key',right_index=True, how='left')  # 左連接
pd.merge(df_left,df_right,left_on='key',right_index=True, how='right')  # 右連接
>>

 4、merge在多層嵌套index的情況

# 建立多層索引數據,左邊數據兩個字段數據,對應右邊數據多層索引
df_left_hr = DataFrame({'key1': ['SF','SF','SF','LA','LA'], 'key2': [10, 20, 30, 20, 30], 'data_set': np.arange(5.)}) df_left_hr >> key1 key2 data_set 0 SF 10 0.0 1 SF 20 1.0 2 SF 30 2.0 3 LA 20 3.0 4 LA 30 4.0 df_right_hr = DataFrame(np.arange(10).reshape((5, 2)), index=[['LA','LA','SF','SF','SF'], [20, 10, 10, 10, 20]], columns=['col_1', 'col_2']) df_right_hr >> col_1 col_2 LA 20 0 1 10 2 3 SF 10 4 5 10 6 7 20 8 9
# 通過key1, key2連接,並且使用左邊數據的索引
pd.merge(df_left_hr,df_right_hr,left_on=['key1','key2'],right_index=True)
>>

 

 二、join

join默認是在索引上進行合並

left = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'], 
                    'B': ['B0', 'B1', 'B2', 'B3']}, 
                    index = ['K0', 'K1', 'K2', 'K3']) 
left
>>
        A    B
K0    A0    B0
K1    A1    B1
K2    A2    B2
K3    A3    B3


right = pd.DataFrame({'C': ['C0', 'C1', 'C2', 'C3', 'C4'], 
                      'D': ['D0', 'D1', 'D2', 'D3', 'D4']}, 
                      index = ['K0', 'K1', 'K2', 'K3', 'K4']) 
right
>>
        C    D
K0    C0    D0
K1    C1    D1
K2    C2    D2
K3    C3    D3
K4    C4    D4

1、內連接

# 默認內連接
left.join(right) # 注意,只能用df1.join(df2)的格式 >>

 2、外連接

left.join(right, how='outer')
>>

 3、左右連接分別指定how='left', how='right'即可

 4、多個字段連接

df_left = DataFrame({'key1': ['SF', 'SF', 'LA'],
                  'key2': ['one', 'two', 'one'],
                  'left_data': [10,20,30]},
                   index=['a', 'b', 'c'])
df_left
>>
     key1  key2   left_data
a    SF    one    10
b    SF    two    20
c    LA    one    30


df_right = DataFrame({'key1': ['SF', 'SF', 'LA', 'Lb'],
                   'key2': ['one', 'one', 'one', 'two'],
                   'right_data': [40,50,60,70]},
                    index=['k', 'j', 'y', 'x'])
df_right
>>
     key1  key2   right_data
k    SF    one    40
j    SF    one    50
y    LA    one    60
x    Lb    two    70

1)連接單列,有其他相同字段,加后綴

df_left.join(df_right, on='key1',how='outer', rsuffix='aa')  # 相同列加aa后綴
>>

 2)多列連接

pd.merge(df_left, df_right, on=['key1', 'key2'],how='outer')
>>

 三、concat

1、縱向拼接

 將數據沿指定軸方向拼接,默認是縱向拼接,效果與df1.append(df2)一樣

前提:列數量和字段名必須相等

df1 = pd.DataFrame({'key1': ['SF','SF','SF','LA','LA'],
                   'key2': [10, 20, 30, 20, 30],
                   'data_set': np.arange(5.)})
df1
>>
       key1    key2    data_set
0    SF    10    0.0
1    SF    20    1.0
2    SF    30    2.0
3    LA    20    3.0
4    LA    30    4.0


df2 = pd.DataFrame({'key1': ['FS','SF','FS','LA','LA'],
                   'key2': [10, 20, 30, 20, 30],
                   'data_set': np.arange(5.)})
df2
>>
key1    key2    data_set
0    FS    10    0.0
1    SF    20    1.0
2    FS    30    2.0
3    LA    20    3.0
4    LA    30    4.0
# 縱向拼接,以下兩個代碼效果一樣
pd.concat([df1, df2])  # 目前發現縱向拼接時候:join='inner','outer'效果一樣

df1.append(df2)  # 不過append不能用於橫向拼接
>>

    

 2、橫向拼接

# 定義兩個索引數據
df4 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
              'B': ['B0', 'B1', 'B2', 'B3'],
              'C': ['C0', 'C1', 'C2', 'C3'],
              'D': ['D0', 'D1', 'D2', 'D3']},
              index=[0, 1, 2, 3])
df4
>>
      A    B     C     D
0    A0    B0    C0    D0
1    A1    B1    C1    D1
2    A2    B2    C2    D2
3    A3    B3    C3    D3


df5 = pd.DataFrame({'B': ['B2', 'B3', 'B6', 'B7'],
                    'D': ['D2', 'D3', 'D6', 'D7'],
                    'F': ['F2', 'F3', 'F6', 'F7']},
                    index=[2, 3, 6, 7])
df5
>>
      B    D     F
2    B2    D2    F2
3    B3    D3    F3
6    B6    D6    F6
7    B7    D7    F7

1)、橫向,默認是外連接

pd.concat([df4, df5], axis=1)
>>

 2)、內連接

# 指定join='inner'
pd.concat([df4, df5], axis=1, join='inner') 
>>

 3)、指定左邊序列索引當索引

# 通過join_axes,指定df4索引的索引為索引,類似於左連接
pd.concat([df4, df5], axis=1, join_axes=[df4.index]) 
>>

  4)、指定右邊序列索引當索引

# 通過join_axes,指定df5索引的索引為索引,類似於右連接
pd.concat([df4, df5], axis=1, join_axes=[df5.index])
>>


免責聲明!

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



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