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
Hàm TRIMRANGE() – Hàm xóa giá trị trống “đỉnh” hơn cả TRIM.

Như bạn đã biết hàm TRIM() trong Excel giúp loại bỏ các ký tự trống (khoảng trắng). Tương tự vậy hàm TRIMRANGE() được sử dụng để xóa các giá trị trống khỏi một phạm vi

Xem thêm
[HOẠT ĐỘNG CỘNG ĐỒNG] Cuộc thi Financial Student Contest (FSC) mùa 13 – CLB Tài chính – Chứng khoán (SeSC) – Đại học Ngoại Thương CSII TP. HCM (FTU2)

Chiều tối ngày 13/06/2025, Chung kết cuộc thi Financial Student Contest (FSC) mùa 13 do CLB Tài chính – Chứng khoán (SeSC) thuộc Đại học Ngoại Thương CSII TP. HCM (FTU2)

Xem thêm
[HOẠT ĐỘNG CỘNG ĐỒNG] Cuộc thi myInsight – MDS Datathon Challenge 2025 – CLB Toán ứng dụng & Khoa học dữ liệu (MDS) – CSII Đại học Ngoại Thương TP. HCM (FTU2)

Chiều ngày 08/06/2025 vừa qua, cuộc thi myInsight – MDS Datarthon Challenge 2025 đã chính thức tiến đến vòng chung kết dưới sự góp mặt của top 5 đội thi xuất

Xem thêm
Cảm nhận học viên khóa Excel for Analysts

“Mình rất hài lòng về tính ứng dụng thực tế và khả năng nâng cao hiệu quả công việc của khóa học.” Anh Nguyễn Trung Hòa – nhân sự ngành Kế

Xem thêm