Python Pandas - Hợp nhất / Tham gia

Pandas có các hoạt động kết hợp trong bộ nhớ đầy đủ tính năng, hiệu suất cao về mặt thành ngữ, rất giống với cơ sở dữ liệu quan hệ như SQL.

Pandas cung cấp một chức năng duy nhất, merge, là điểm nhập cho tất cả các hoạt động kết hợp cơ sở dữ liệu tiêu chuẩn giữa các đối tượng DataFrame -

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

Ở đây, chúng tôi đã sử dụng các tham số sau:

  • left - Một đối tượng DataFrame.

  • right - Một đối tượng DataFrame khác.

  • on- Các cột (tên) để tham gia. Phải được tìm thấy trong cả hai đối tượng DataFrame bên trái và bên phải.

  • left_on- Các cột từ DataFrame bên trái để sử dụng làm khóa. Có thể là tên cột hoặc mảng có độ dài bằng độ dài của DataFrame.

  • right_on- Các cột từ DataFrame bên phải để sử dụng làm khóa. Có thể là tên cột hoặc mảng có độ dài bằng độ dài của DataFrame.

  • left_index - Nếu True,sử dụng chỉ mục (các nhãn hàng) từ DataFrame bên trái làm (các) khóa tham gia của nó. Trong trường hợp DataFrame có MultiIndex (phân cấp), số cấp phải khớp với số lượng khóa tham gia từ DataFrame bên phải.

  • right_index - Cách sử dụng tương tự như left_index cho đúng DataFrame.

  • how- Một trong các "trái", "phải", "bên ngoài", "bên trong". Mặc định là bên trong. Mỗi phương pháp đã được mô tả dưới đây.

  • sort- Sắp xếp kết quả DataFrame theo các phím nối theo thứ tự từ vựng. Mặc định thành True, đặt thành False sẽ cải thiện đáng kể hiệu suất trong nhiều trường hợp.

Bây giờ chúng ta hãy tạo hai DataFrame khác nhau và thực hiện các thao tác hợp nhất trên nó.

# import the pandas library
import pandas as pd
left = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame(
   {'id':[1,2,3,4,5],
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print left
print right

Nó là output như sau -

Name  id   subject_id
0   Alex   1         sub1
1    Amy   2         sub2
2  Allen   3         sub4
3  Alice   4         sub6
4  Ayoung  5         sub5

    Name  id   subject_id
0  Billy   1         sub2
1  Brian   2         sub4
2  Bran    3         sub3
3  Bryce   4         sub6
4  Betty   5         sub5

Hợp nhất hai DataFrames trên một khóa

import pandas as pd
left = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
	'id':[1,2,3,4,5],
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left,right,on='id')

Nó là output như sau -

Name_x   id  subject_id_x   Name_y   subject_id_y
0  Alex      1          sub1    Billy           sub2
1  Amy       2          sub2    Brian           sub4
2  Allen     3          sub4     Bran           sub3
3  Alice     4          sub6    Bryce           sub6
4  Ayoung    5          sub5    Betty           sub5

Hợp nhất hai DataFrames trên nhiều phím

import pandas as pd
left = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
	'id':[1,2,3,4,5],
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left,right,on=['id','subject_id'])

Nó là output như sau -

Name_x   id   subject_id   Name_y
0    Alice    4         sub6    Bryce
1   Ayoung    5         sub5    Betty

Hợp nhất bằng cách sử dụng đối số 'how'

Các howđối số để hợp nhất chỉ định cách xác định khóa nào sẽ được đưa vào bảng kết quả. Nếu tổ hợp phím không xuất hiện trong bảng bên trái hoặc bên phải, các giá trị trong bảng đã nối sẽ là NA.

Đây là một bản tóm tắt về how các tùy chọn và tên tương đương SQL của chúng -

Phương pháp hợp nhất SQL tương đương Sự miêu tả
trái THAM GIA BÊN NGOÀI TRÁI Sử dụng các phím từ đối tượng bên trái
đúng THAM GIA ĐÚNG Sử dụng các phím từ đối tượng bên phải
bên ngoài THAM GIA NGOÀI TRỜI ĐẦY ĐỦ Sử dụng liên hợp các khóa
bên trong THAM GIA INNER Sử dụng giao điểm của các phím

Chỗ nối bên trái

import pandas as pd
left = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left, right, on='subject_id', how='left')

Nó là output như sau -

Name_x   id_x   subject_id   Name_y   id_y
0     Alex      1         sub1      NaN    NaN
1      Amy      2         sub2    Billy    1.0
2    Allen      3         sub4    Brian    2.0
3    Alice      4         sub6    Bryce    4.0
4   Ayoung      5         sub5    Betty    5.0

Tham gia đúng

import pandas as pd
left = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left, right, on='subject_id', how='right')

Nó là output như sau -

Name_x  id_x   subject_id   Name_y   id_y
0      Amy   2.0         sub2    Billy      1
1    Allen   3.0         sub4    Brian      2
2    Alice   4.0         sub6    Bryce      4
3   Ayoung   5.0         sub5    Betty      5
4      NaN   NaN         sub3     Bran      3

Tham gia bên ngoài

import pandas as pd
left = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left, right, how='outer', on='subject_id')

Nó là output như sau -

Name_x  id_x   subject_id   Name_y   id_y
0     Alex   1.0         sub1      NaN    NaN
1      Amy   2.0         sub2    Billy    1.0
2    Allen   3.0         sub4    Brian    2.0
3    Alice   4.0         sub6    Bryce    4.0
4   Ayoung   5.0         sub5    Betty    5.0
5      NaN   NaN         sub3     Bran    3.0

Tham gia bên trong

Tham gia sẽ được thực hiện trên chỉ mục. Hoạt động tham gia tôn vinh đối tượng mà nó được gọi. Vì thế,a.join(b) Không bằng b.join(a).

import pandas as pd
left = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left, right, on='subject_id', how='inner')

Nó là output như sau -

Name_x   id_x   subject_id   Name_y   id_y
0      Amy      2         sub2    Billy      1
1    Allen      3         sub4    Brian      2
2    Alice      4         sub6    Bryce      4
3   Ayoung      5         sub5    Betty      5