Nối các mảng dữ liệu trong Python

Concatinate dữ liệu

Trong quá trình xử lý dữ liệu với pandas, việc kết hợp nhiều bảng dữ liệu là thao tác rất phổ biến. Hàm concat() chính là công cụ mạnh mẽ giúp bạn làm điều này một cách dễ dàng, linh hoạt và hiệu quả. 

Trong bài viết này, UniTrain sẽ giúp bạn hiểu rõ về hàm concat() – cách sử dụng để nối các mảng dữ liệu, các tuỳ chọn quan trọng và ví dụ minh hoạ thực tế. 

 Hàm Concat() 

Hàm concat() giúp nối nhiều đối tượng Series hoặc DataFrame theo một trục, đồng thời thể xử chỉ mục của các trục khác bằng cách thực hiện các phép toán hợp hoặc giao. Tương tự như numpy.concatenate(), hàm này nhận một danh sách hoặc từ điển các đối tượng cùng kiểu nối chúng lại với nhau. 

import pandas as pd

# Creating two DataFrames
df1 = 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])

df2 = pd.DataFrame({
    "A": ["A4", "A5", "A6", "A7"],
    "B": ["B4", "B5", "B6", "B7"],
    "C": ["C4", "C5", "C6", "C7"],
    "D": ["D4", "D5", "D6", "D7"],
}, index=[4, 5, 6, 7])

# Concatenating the two DataFrames
result = pd.concat([df1, df2])

print(result)

Kết quả hiển thị:

    A   B   C   D
0  A0  B0  C0  D0
1  A1  B1  C1  D1
2  A2  B2  C2  D2
3  A3  B3  C3  D3
4  A4  B4  C4  D4
5  A5  B5  C5  D5
6  A6  B6  C6  D6
7  A7  B7  C7  D7

Sử dụng Axis để thay đổi chiều nối

Từ khóa join dùng để xác định cách xử lý các giá trị trục (axis values) (ví dụ: index hoặc column) không tồn tại trong DataFrame đầu tiên.

Join=’outer’ (mặc định) sẽ lấy hợp (union) của tất cả các giá trị trên trục đó. Nếu các index hoặc column không trùng nhau, thì tất cả đều sẽ được giữ lại và những vị trí không có giá trị sẽ được điền NaN.

import pandas as pd

# DataFrame 1
df1 = pd.DataFrame({
    'A': ['A0', 'A1', 'A2'],
    'B': ['B0', 'B1', 'B2'],
    'C': ['C0', 'C1', 'C2']
}, index=[0, 1, 2])

# DataFrame 2
df2 = pd.DataFrame({
    'A': ['A3', 'A4', 'A5'],
    'B': ['B3', 'B4', 'B5'],
    'C': ['C3', 'C4', 'C5']
}, index=[3, 4, 5])

# Nối theo chiều ngang
result = pd.concat([df1, df2], axis=1)

print(result)

Kết quả hiển thị:

     A   B   C    A   B   C
0   A0  B0  C0  NaN NaN NaN
1   A1  B1  C1  NaN NaN NaN
2   A2  B2  C2  NaN NaN NaN
3  NaN NaN NaN   A3  B3  C3
4  NaN NaN NaN   A4  B4  C4
5  NaN NaN NaN   A5  B5  C5

Khi sử dụng pd.concat() với join=’inner’, bạn đang yêu cầu lấy giao của các giá trị chỉ số (index) trong tất cả các DataFrame mà bạn đang nối lại với nhau. Giao của chỉ số (intersection): Tức là chỉ những chỉ số xuất hiện trong tất cả các DataFrame mới được giữ lại trong kết quả. Các chỉ số không xuất hiện trong tất cả các DataFrame sẽ bị loại bỏ.

import pandas as pd

# DataFrame 1
df1 = pd.DataFrame({
    'A': ['A0', 'A1', 'A2'],
    'B': ['B0', 'B1', 'B2']
}, index=[0, 1, 2])

# DataFrame 2
df2 = pd.DataFrame({
    'C': ['C1', 'C2', 'C3'],
    'D': ['D1', 'D2', 'D3']
}, index=[1, 2, 3])

# Nối hai DataFrame theo chiều ngang, chỉ giữ lại các index chung
result = pd.concat([df1, df2], axis=1, join='inner')

print(result)

Kết quả hiển thị:

     A   B   C   D
1   A1  B1  C1  D1
2   A2  B2  C2  D2

Giữ index bên trái với reindex()

Khi thực hiện “left join”, ta giữ tất cả chỉ số từ DataFrame bên trái. Để đảm bảo kết quả giữ đúng chỉ số gốc, ta sử dụng reindex(). Điều này giúp chỉ số của kết quả trùng với chỉ số của DataFrame bên trái, ngay cả khi các DataFrame có chỉ số khác nhau.

import pandas as pd
# DataFrame gốc (df1)
df1 = 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])

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

# Nối hai DataFrame và tái chỉ mục kết quả theo chỉ số của df1
result = pd.concat([df1, df4], axis=1).reindex(df1.index)

print(result)

Kết quả hiển thị:

     A   B   C   D    B    D    F
0   A0  B0  C0  D0  NaN  NaN  NaN
1   A1  B1  C1  D1  NaN  NaN  NaN
2   A2  B2  C2  D2   B2   D2   F2
3   A3  B3  C3  D3   B3   D3   F3

Khi bạn nối (concatenate) nhiều DataFrame lại với nhau bằng pd.concat() hoặc DataFrame.append(), mỗi DataFrame có thể có chỉ mục (index) riêng. Nếu các chỉ mục này bị trùng lặp, kết quả có thể gây nhầm lẫn hoặc lỗi.  

Để tránh điều này, bạn có thể sử dụng tham số ignore_index=True. Khi được đặt, pandas sẽ bỏ qua các chỉ mục gốc và tạo lại chỉ mục mới liên tục từ 0. 

import pandas as pd

# DataFrame 1 có các cột: A, B, C, D
df1 = pd.DataFrame({
    'A': ['A0', 'A1', 'A2', 'A3'],
    'B': ['B0', 'B1', 'B2', 'B3'],
    'C': ['C0', 'C1', 'C2', 'C3'],
    'D': ['D0', 'D1', 'D2', 'D3'] })

# DataFrame 2 có các cột: B, D, F (thiếu A và C, có thêm F)
df2 = pd.DataFrame({
    'B': ['B2', 'B3', 'B6', 'B7'],
    'D': ['D2', 'D3', 'D6', 'D7'],
    'F': ['F2', 'F3', 'F6', 'F7'] })

# Nối hai DataFrame lại với nhau
result = pd.concat([df1, df2], ignore_index=True, sort=False)

print(result)

Kết quả hiển thị:

     A    B    C    D    F
0   A0   B0   C0   D0  NaN
1   A1   B1   C1   D1  NaN
2   A2   B2   C2   D2  NaN
3   A3   B3   C3   D3  NaN
4  NaN   B2  NaN   D2   F2
5  NaN   B3  NaN   D3   F3
6  NaN   B6  NaN   D6   F6
7  NaN   B7  NaN   D7   F7

Kết luận

Hàm concat() trong pandas là một công cụ cực kỳ linh hoạt để kết hợp nhiều bảng dữ liệu lại với nhau. Việc hiểu rõ cách hoạt động của các tham số như axis, join, ignore_index sẽ giúp bạn xử lý dữ liệu nhanh chóng và chính xác hơn, đặc biệt trong các dự án phân tích và làm sạch dữ liệu thực tế.

Hãy luyện tập nhiều tình huống khác nhau để thành thạo hơn với concat() cũng như các thao tác tiền xử lý dữ liệu quan trọng khác nhé!

Xem thêm

Xử lý và trực quan hóa dữ liệu với Python

Cách sử dụng Function trong Python

Bắt đầu với Pandas: Cách tạo Series và DataFrame một cách dễ dàng

Ngoài ra, các bạn có thể theo dõi Fanpage để cập nhật nhanh những kiến thức khác nữa nhé!

Bài viết liên quan
Ứng dụng hàm TEXTJOIN nâng cao trong Excel

1. Giới thiệu hàm TEXTJOIN và IF  Hàm TEXTJOIN trong Excel giúp nối các giá trị từ một phạm vi hoặc danh sách các ô, sử dụng dấu phân cách tùy

Xem thêm
30 tháng Tư rực rỡ, 1/5 ưu đãi bất ngờ

Mừng 50 năm thống nhất Đất nước, UniTrain ưu đãi đến 2.500.000 VNĐ trên học phí gốc cho học viên đăng ký các khóa combo. CÁC COMBO KHÓA HỌC ÁP DỤNG

Xem thêm
Phân biệt WHERE và HAVING trong SQL

Trong SQL, lọc dữ liệu là một bước quan trọng giúp truy vấn trả về kết quả chính xác và tối ưu hơn. Hai mệnh đề thường được sử dụng để

Xem thêm
Mừng ngày Giỗ Tổ – Bùng nổi ưu đãi

Nhân ngày Giỗ Tổ Hùng Vương, UniTrain giảm thêm 130.000đ trên ưu đãi đóng sớm khi đăng ký tất cả các khóa học ở UniTrain. MỘT SỐ CÁC KHÓA HỌC LẺ

Xem thêm