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
Khám phá hàm Lag và Lead trong SQL

Trong phân tích dữ liệu, hàm LAG() và LEAD() sẽ là công cụ hỗ trợ đắc lực cho việc so sánh giá trị hiện tại với giá trị liền trước hoặc liền

Xem thêm
[RECAP] Training Top 20 – myInsight – MDS Datathon Challenge 2025 – CLB Toán ứng dụng & Khoa học dữ liệu (MDS) – Đại học Ngoại Thương CSII TP. HCM (FTU2)

Tối ngày 18/05/2025, buổi training dành riêng cho Top 20 đội thi xuất sắc nhất cuộc thi myInsight – MDS Datathon Challenge 2025 đã diễn ra vô cùng thành công thông

Xem thêm
Khám Phá Tính Năng Nhóm và Phân Nhóm Dữ Liệu trong Power BI

Trong quá trình xây dựng biểu đồ, Power BI Desktop sẽ tự động tổng hợp dữ liệu thành các nhóm dựa trên các giá trị có trong tập dữ liệu gốc.

Xem thêm
[RECAP] Chuỗi Workshop MARKET-A – CLB Chứng khoán SCUE – Đại học Kinh tế TP. HCM (UEH)

Chiều ngày 15/05/2025 vừa rồi, UniTrain đã hân hạnh có mặt với vai trò là Nhà tài trợ Bạc tại buổi Workshop 2: OPTIVEST thuộc chuỗi chương trình Workshop MARKET-A do

Xem thêm