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 có thể xử lý 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 và 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é!