Hướng dẫn python left join - python tham gia trái

Pandas có đầy đủ tính năng, hiệu suất cao trong hoạt động in-memory join rất giống với cơ sở dữ liệu quan hệ như SQL. Các phương pháp này thực hiện tốt hơn đáng kể so với các mã nguồn mở khác (như merge.data.frame trong R). Lý do của việc này là thiết kế thuật toán cẩn thận và cách bố trí nội bộ của dữ liệu trong dataframe.

Pandas cung cấp một hàm duy nhất cho tất cả các kiểu joining/merging. Cú pháp như sau:

pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,(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)

left

một đối tượng dataframe

right

đối tượng dataframe khác

on

tên các cột sẽ làm key để join với điều kiện các cột phải nằm trong cả hai DataFrame. Mặc định nó sẽ tự nhận các cột có cùng tên làm keys để join.

left_on

Dùng các cột từ left dataframe để làm key cho việc join. Có thể là tên cột hoặc mảng có chiều dài bằng độ dài của dataframe

right_on

Dùng các cột từ right dataframe  để làm key cho việc join. Có thể là tên cột hoặc mảng có chiều dài bằng độ dài của dataframe.

left_index

Nếu là True, sử dụng index (row labels) left từ dataframe như là key để join. Trong trương hợp MultiIndex dataframe, key join xem xét cả level của index.

right_index

Nếu là True, sử dụng index (row labels) right từ dataframe như là key để join. Trong trương hợp MultiIndex dataframe, key join xem xét cả level của index.

how

kiểu join 'left', 'right', 'outer', 'inner'. Mặc định là inner.

sort

dataframe trả về có được sort theo key hay không.

suffixes

Một tuple của các hậu tố của string sử dụng cho các cột trùng lặp. Mặc định là (_x, _y).

copy

Mặc định là True, dữ liệu được xử lý trên đối tượng dataframe mới hay không

indicator

Thêm cột vào dataframe đầu ra được gọi là _merge với thông tin về nguồn của mỗi hàng. _merge là phần phân loại và lấy giá trị left_only cho các quan sát có khoá hợp nhất chỉ xuất hiện trong left dataframe, right_only cho các quan sát có key hợp nhất chỉ xuất hiện trong right dataframe và cả hai nếu key hợp nhất quan sát được tìm thấy trong cả hai

Giải thích ‘how: Nếu bạn đã quen với joining trong SQL thì bảng sau cho ta một so sánh giữa joining trong pandas và SQL. Mọi người có thể tham khảo thêm sự so sánh này tại trang webNếu bạn đã quen với joining trong SQL thì bảng sau cho ta một so sánh giữa joining trong pandas và SQL. Mọi người có thể tham khảo thêm sự so sánh này tại trang web

“how”

Tương tự trong SQL

Giải Thích

left

LEFT OUTER JOIN

Sử dụng các keys từ bảng bên trái

right

RIGHT OUTER JOIN

Sử dụng các keys từ bảng bên phải

outer

FULL OUTER JOIN

Sử dụng các keys từ cả hai bảng

inner

INNER JOIN

Sử dụng các keys chung giứa hai bảng

Chúng ta cùng đi vào ví dụ cụ thể sẽ dễ hiểu hơn.

Ta có hai bảng dữ liệu bên trái, sau khi merge sẽ cho bảng cuối cùng bên phải.

>>> import pandas as pd

>>> import numpy as np

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

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

>>>

Cụ thể hình dạng left, right như sau và mặc định how=”inner”

>>> left

    A   B key1 key2

0  A0  B0   K0   K0

1  A1  B1   K0   K1

2  A2  B2   K1   K0

3  A3  B3   K2   K1

>>> right

    C   D key1 key2

0  C0  D0   K0   K0

1  C1  D1   K1   K0

2  C2  D2   K1   K0

3  C3  D3   K2   K0

>>> pd.merge(left, right, on=['key1', 'key2'])

    A   B key1 key2   C   D

0  A0  B0   K0   K0  C0  D0

1  A2  B2   K1   K0  C1  D1

2  A2  B2   K1   K0  C2  D2

>>>

Kết quả của phép join với “how” = ‘left’.

>>> pd.merge(left, right, how='left', on=['key1', 'key2'])

    A   B key1 key2    C    D

0  A0  B0   K0   K0   C0   D0

1  A1  B1   K0   K1  NaN  NaN

2  A2  B2   K1   K0   C1   D1

3  A2  B2   K1   K0   C2   D2

4  A3  B3   K2   K1  NaN  NaN

>>>

Giải thích về suffixes: Ý nghĩa của suffixes được giải thích qua ví dụ sau: Trường hợp hai bảng có tên cột giống nhau khi joining (chú ý tên cột giống nhau, không phải tên key giống nhau). Từ khóa suffixes sẽ giúp phân biệt cột giống nhau đến từ dataframe nào bằng cách cho thêm hậu tố vào tên cột.Ý nghĩa của suffixes được giải thích qua ví dụ sau: Trường hợp hai bảng có tên cột giống nhau khi joining (chú ý tên cột giống nhau, không phải tên key giống nhau). Từ khóa suffixes sẽ giúp phân biệt cột giống nhau đến từ dataframe nào bằng cách cho thêm hậu tố vào tên cột.

>>> pd.merge(left, right, on=[left.A,right.D], how='outer',suffixes=('_left','_right'))

    A   B key1_left key2_left   C   D key1_right key2_right

0  A0  B0        K0        K0  C0  D0         K0         K0

1  A1  B1        K0        K1  C1  D1         K1         K0

2  A2  B2        K1        K0  C2  D2         K1         K0

3  A3  B3        K2        K1  C3  D3         K2         K0

>>>

Giải thích về indicator: Ý nghĩa của indicator được giải thích qua ví dụ sau. Bạn có thể so sánh với indicator=False và True qua hai đoạn mã bên dưới. Như vậy indicator giúp chỉ rõ hàng đó đến từ dataframe nào.Ý nghĩa của indicator được giải thích qua ví dụ sau. Bạn có thể so sánh với indicator=False và True qua hai đoạn mã bên dưới. Như vậy indicator giúp chỉ rõ hàng đó đến từ dataframe nào.

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

     A    B key1 key2    C    D

0   A0   B0   K0   K0   C0   D0

1   A1   B1   K0   K1  NaN  NaN

2   A2   B2   K1   K0   C1   D1

3   A2   B2   K1   K0   C2   D2

4   A3   B3   K2   K1  NaN  NaN

5  NaN  NaN   K2   K0   C3   D3

>>> pd.merge(left, right, on=['key1','key2'], how='outer',indicator =True)

     A    B key1 key2    C    D      _merge

0   A0   B0   K0   K0   C0   D0        both

1   A1   B1   K0   K1  NaN  NaN   left_only

2   A2   B2   K1   K0   C1   D1        both

3   A2   B2   K1   K0   C2   D2        both

4   A3   B3   K2   K1  NaN  NaN   left_only

5  NaN  NaN   K2   K0   C3   D3  right_only

>>>

Joining on index

.join() là một phương pháp thuận tiện để kết hợp các cột của hai dataframe được lập chỉ mục khác nhau có khả năng phân loại khác nhau vào một dataframe đơn. Đây là một ví dụ rất cơ bản:
>>> left = pd.DataFrame({'A': ['A0', 'A1', 'A2'],'B': ['B0', 'B1', 'B2']},index=['K0', 'K1', 'K2'])
>>> right = pd.DataFrame({'C': ['C0', 'C2', 'C3'],'D': ['D0', 'D2', 'D3']},index=['K0', 'K2', 'K3'])
>>> 
Hình dạng của left và right sẽ như sau:
>>> left
     A   B
K0  A0  B0
K1  A1  B1
K2  A2  B2
>>> right
     C   D
K0  C0  D0
K2  C2  D2
K3  C3  D3
>>> left.join(right)
     A   B    C    D
K0  A0  B0   C0   D0
K1  A1  B1  NaN  NaN
K2  A2  B2   C2   D2
>>>

Với ví dụ phía trên tương đương lệnh sau khi dùng merge:

>>> import pandas as pd

>>> import numpy as np

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

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

>>>
0
>>> import pandas as pd

>>> import numpy as np

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

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

>>>
1
>>> import pandas as pd

>>> import numpy as np

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

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

>>>
2
>>> import pandas as pd

>>> import numpy as np

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

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

>>>
3
>>> import pandas as pd

>>> import numpy as np

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

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

>>>
4
>>> import pandas as pd

>>> import numpy as np

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

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

>>>
5

Hình dạng của left và right sẽ như sau:

>>> import pandas as pd

>>> import numpy as np

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

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

>>>
6

​​​​​​Ví dụ tiếp theo cho trường hợp multikey, được truyền đến dataframe có MultiIndex

>>> import pandas as pd

>>> import numpy as np

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

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

>>>
7

Kết quả được trình bầy trong hình sau:

>>> import pandas as pd

>>> import numpy as np

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

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

>>>
8
>>> import pandas as pd

>>> import numpy as np

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

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

>>>
9
>>> left

    A   B key1 key2

0  A0  B0   K0   K0

1  A1  B1   K0   K1

2  A2  B2   K1   K0

3  A3  B3   K2   K1

>>> right

    C   D key1 key2

0  C0  D0   K0   K0

1  C1  D1   K1   K0

2  C2  D2   K1   K0

3  C3  D3   K2   K0

>>> pd.merge(left, right, on=['key1', 'key2'])

    A   B key1 key2   C   D

0  A0  B0   K0   K0  C0  D0

1  A2  B2   K1   K0  C1  D1

2  A2  B2   K1   K0  C2  D2

>>>
0
>>> left

    A   B key1 key2

0  A0  B0   K0   K0

1  A1  B1   K0   K1

2  A2  B2   K1   K0

3  A3  B3   K2   K1

>>> right

    C   D key1 key2

0  C0  D0   K0   K0

1  C1  D1   K1   K0

2  C2  D2   K1   K0

3  C3  D3   K2   K0

>>> pd.merge(left, right, on=['key1', 'key2'])

    A   B key1 key2   C   D

0  A0  B0   K0   K0  C0  D0

1  A2  B2   K1   K0  C1  D1

2  A2  B2   K1   K0  C2  D2

>>>
1

Kết quả:

>>> left

    A   B key1 key2

0  A0  B0   K0   K0

1  A1  B1   K0   K1

2  A2  B2   K1   K0

3  A3  B3   K2   K1

>>> right

    C   D key1 key2

0  C0  D0   K0   K0

1  C1  D1   K1   K0

2  C2  D2   K1   K0

3  C3  D3   K2   K0

>>> pd.merge(left, right, on=['key1', 'key2'])

    A   B key1 key2   C   D

0  A0  B0   K0   K0  C0  D0

1  A2  B2   K1   K0  C1  D1

2  A2  B2   K1   K0  C2  D2

>>>
2
>>> left

    A   B key1 key2

0  A0  B0   K0   K0

1  A1  B1   K0   K1

2  A2  B2   K1   K0

3  A3  B3   K2   K1

>>> right

    C   D key1 key2

0  C0  D0   K0   K0

1  C1  D1   K1   K0

2  C2  D2   K1   K0

3  C3  D3   K2   K0

>>> pd.merge(left, right, on=['key1', 'key2'])

    A   B key1 key2   C   D

0  A0  B0   K0   K0  C0  D0

1  A2  B2   K1   K0  C1  D1

2  A2  B2   K1   K0  C2  D2

>>>
3
>>> left

    A   B key1 key2

0  A0  B0   K0   K0

1  A1  B1   K0   K1

2  A2  B2   K1   K0

3  A3  B3   K2   K1

>>> right

    C   D key1 key2

0  C0  D0   K0   K0

1  C1  D1   K1   K0

2  C2  D2   K1   K0

3  C3  D3   K2   K0

>>> pd.merge(left, right, on=['key1', 'key2'])

    A   B key1 key2   C   D

0  A0  B0   K0   K0  C0  D0

1  A2  B2   K1   K0  C1  D1

2  A2  B2   K1   K0  C2  D2

>>>
4

Ta sẽ truyển về phéo join cơ bản trên key.

>>> left

    A   B key1 key2

0  A0  B0   K0   K0

1  A1  B1   K0   K1

2  A2  B2   K1   K0

3  A3  B3   K2   K1

>>> right

    C   D key1 key2

0  C0  D0   K0   K0

1  C1  D1   K1   K0

2  C2  D2   K1   K0

3  C3  D3   K2   K0

>>> pd.merge(left, right, on=['key1', 'key2'])

    A   B key1 key2   C   D

0  A0  B0   K0   K0  C0  D0

1  A2  B2   K1   K0  C1  D1

2  A2  B2   K1   K0  C2  D2

>>>
5

Chuyển ba cột “key”,’X’,’Y’ làm index qua phương thức đã học set_index().

>>> left

    A   B key1 key2

0  A0  B0   K0   K0

1  A1  B1   K0   K1

2  A2  B2   K1   K0

3  A3  B3   K2   K1

>>> right

    C   D key1 key2

0  C0  D0   K0   K0

1  C1  D1   K1   K0

2  C2  D2   K1   K0

3  C3  D3   K2   K0

>>> pd.merge(left, right, on=['key1', 'key2'])

    A   B key1 key2   C   D

0  A0  B0   K0   K0  C0  D0

1  A2  B2   K1   K0  C1  D1

2  A2  B2   K1   K0  C2  D2

>>>
6

Kết Luận

Ở đây, bạn đã học tất cả các cách thức hợp nhất các cấu trúc dữ liệu trong pandas. Bạn đã khám phá ra các kỹ thuật khác nhau để hợp nhất và tìm hiểu về các liên kết như inner, outer, right, left, join, cũng như thời điểm để sử dụng qua hai phương thức chính là .join() và pd.merge(). Và bạn nên thực hành nhiều để có thể hiểu rõ hơn về các tham số như on, left_on, right_on, how, suffixes …on, left_on, right_on, how, suffixes