Tự Học Data Science · 02/12/2023 0

03.06 Combining Datasets – Concat and Append

Nhớ lại: Ghép nối các mảng NumPy

Nối SeriesDataFrame rất giống việc nối các mảng Numpy, có thể thực hiện thông qua hàm np.concatenate như đã thảo luận trong Cơ bản về mảng NumPy.Nhớ rằng với nó, bạn có thể kết hợp nội dung của hai hoặc nhiều mảng thành một mảng duy nhất:

x = [1, 2, 3]y = [4, 5, 6]z = [7, 8, 9]np.concatenate([x, y, z])
array([1, 2, 3, 4, 5, 6, 7, 8, 9])

Đối số đầu tiên là một danh sách hoặc bộ các mảng để khối ghép.Ngoài ra, nó còn lấy một từ khóa axis cho phép bạn xác định trục theo chiều mà kết quả sẽ được ghép:

x = [[1, 2],     [3, 4]]np.concatenate([x, x], axis=1)
array([[1, 2, 1, 2],       [3, 4, 3, 4]])

Cộng gộp đơn giản với pd.concat

Pandas có một hàm, pd.concat(), có cú pháp tương tự np.concatenate nhưng chứa một số tùy chọn mà chúng ta sẽ thảo luận trong thời gian tới:

# Signature in Pandas v0.18pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,          keys=None, levels=None, names=None, verify_integrity=False,          copy=True)

pd.concat() có thể được sử dụng để ghép nối đơn giản các đối tượng Series hoặc DataFrame, tương tự như cách np.concatenate() có thể được sử dụng để ghép nối đơn giản các mảng:

ser1 = pd.Series(['A', 'B', 'C'], index=[1, 2, 3])ser2 = pd.Series(['D', 'E', 'F'], index=[4, 5, 6])pd.concat([ser1, ser2])
1    A2    B3    C4    D5    E6    Fdtype: object

Nó cũng hoạt động để nối các đối tượng có chiều cao hơn, như DataFrame:

df1 = make_df('AB', [1, 2])df2 = make_df('AB', [3, 4])display('df1', 'df2', 'pd.concat([df1, df2])')

df1

df2

pd.concat([df1, df2])

Mặc định, việc ghép nối diễn ra theo dòng trong DataFrame (tức là axis=0).Tương tự như np.concatenate, pd.concat cho phép xác định trục mà ghép nối sẽ diễn ra.Xem ví dụ sau:

df3 = make_df('AB', [0, 1])df4 = make_df('CD', [0, 1])display('df3', 'df4', "pd.concat([df3, df4], axis='col')")

df3

df4

pd.concat([df3, df4], axis=’col’)

Chúng ta có thể tương đương chỉ định axis=1; ở đây chúng ta đã sử dụng cách khái quát hơn là axis='col'.

Các chỉ số trùng lặp

Một sự khác biệt quan trọng giữa np.concatenatepd.concat là việc nối Pandas giữ nguyên các chỉ số, ngay cả khi kết quả có chỉ số trùng lặp!Xem ví dụ đơn giản sau đây:

x = make_df('AB', [0, 1])y = make_df('AB', [2, 3])y.index = x.index  # make duplicate indices!display('x', 'y', 'pd.concat([x, y])')

x

y

pd.concat([x, y])

Lưu ý các chỉ số lặp lại trong kết quả.Trong khi điều này hợp lệ trong các DataFrame, kết quả thường không mong muốn.pd.concat() cung cấp cho chúng ta một số cách để xử lý nó.

Phát hiện lặp lại như một lỗi

Nếu bạn chỉ muốn xác minh rằng các chỉ số trong kết quả của pd.concat() không trùng lap, bạn có thể chỉ định cờ verify_integrity.Với cờ này được đặt thành True, quá trình kết hợp sẽ gây ra một ngoại lệ nếu có các chỉ số trùng lặp.Dưới đây là một ví dụ, trong đó để làm rõ, chúng tôi sẽ bắt và in ra thông báo lỗi:

try:    pd.concat([x, y], verify_integrity=True)except ValueError as e:    print("ValueError:", e)
ValueError: Indexes have overlapping values: [0, 1]

Bỏ qua chỉ mục

Đôi khi chỉ mục chính nó không quan trọng và bạn muốn nó được bỏ qua hoàn toàn.Tùy chọn này có thể được chỉ định bằng cách sử dụng cờ ignore_index.Khi đặt thành true, phép nối sẽ tạo ra một chỉ mục số nguyên mới cho Series kết quả:

display('x', 'y', 'pd.concat([x, y], ignore_index=True)')

x

y

pd.concat([x, y], ignore_index=True)

Thêm khóa MultiIndex

Một lựa chọn khác là sử dụng tùy chọn keys để chỉ định một nhãn cho các nguồn dữ liệu; kết quả sẽ là một chuỗi được chỉ mục theo cấu trúc phân cấp chứa dữ liệu:

display('x', 'y', "pd.concat([x, y], keys=['x', 'y'])")

x

y

pd.concat([x, y], keys=[‘x’, ‘y’])

Kết quả là một DataFrame có chỉ số nhân bản, và chúng ta có thể sử dụng các công cụ đã thảo luận trong Indexing phân cấp để chuyển đổi dữ liệu này thành biểu diễn mà chúng ta quan tâm.

Ghép chuỗi bằng các giá trị kết nối

Trong những ví dụ đơn giản chúng ta vừa xem, chúng ta chủ yếu đã nối các DataFrame với các tên cột chung.Trong thực tế, dữ liệu từ các nguồn khác nhau có thể có các tập hợp tên cột khác nhau và pd.concat cung cấp một số tùy chọn trong trường hợp này.Hãy xem xét việc nối hai DataFrame sau đây, có một số (nhưng không phải tất cả!) cột chung:

df5 = make_df('ABC', [1, 2])df6 = make_df('BCD', [3, 4])display('df5', 'df6', 'pd.concat([df5, df6])')

df5

df6

pd.concat([df5, df6])

Theo mặc định, các mục mà không có dữ liệu sẽ được điền bằng giá trị NA.Để thay đổi điều này, chúng ta có thể chỉ định một trong một số tùy chọn cho các tham số joinjoin_axes của hàm concatenate.Theo mặc định, việc kết hợp là một liên kết các cột đầu vào (join='outer'), nhưng chúng ta có thể thay đổi thành một giao của các cột bằng cách sử dụng join='inner':

display('df5', 'df6',        "pd.concat([df5, df6], join='inner')")

df5

df6

pd.concat([df5, df6], join=’inner’)

Một lựa chọn khác là chỉ định trực tiếp chỉ số của các cột còn lại bằng cách sử dụng đối số join_axes, nó nhận một danh sách các đối tượng chỉ số.Ở đây chúng ta sẽ chỉ định rằng các cột trả về nên giống như các cột của đầu vào đầu tiên:

display('df5', 'df6',        "pd.concat([df5, df6], join_axes=[df5.columns])")

df5

df6

pd.concat([df5, df6], join_axes=[df5.columns])

Kết hợp các tùy chọn của hàm pd.concat cho phép một loạt các hành vi khả thi khi kết hợp hai bộ dữ liệu; hãy ghi nhớ những điều này khi bạn sử dụng các công cụ này cho dữ liệu của bạn.

Phương thức append()

Vì việc nối mảng trực tiếp rất phổ biến, các đối tượng SeriesDataFrame có một phương thức append có thể thực hiện cùng một việc chỉ bằng một số lần gõ ít hơn.Ví dụ, thay vì gọi pd.concat([df1, df2]), bạn có thể đơn giản gọi df1.append(df2):

display('df1', 'df2', 'df1.append(df2)')

df1

df2

df1.append(df2)

Hãy nhớ rằng khác với các phương thức append()extend() của các danh sách Python, phương thức append() trong Pandas không sửa đổi đối tượng gốc, thay vào đó nó tạo ra một đối tượng mới với dữ liệu kết hợp.Nó cũng không phải là một phương thức hiệu quả, vì nó bao gồm việc tạo ra một chỉ mục mới bộ đệm dữ liệu.Do đó, nếu bạn dự định thực hiện nhiều thao tác append, thì thông thường tốt hơn là xây dựng một danh sách các DataFrame và truyền chúng cùng lúc cho hàm concat().

Trong phần tiếp theo, chúng ta sẽ xem xét một phương pháp mạnh mẽ khác để kết hợp dữ liệu từ nhiều nguồn, đó là phương pháp kết hợp/gộp dữ liệu theo cách thức của cơ sở dữ liệu được thực hiện trong pd.merge.Để biết thêm thông tin về concat(), append(), và các chức năng liên quan, xem phần “Kết hợp, Ghép nối và Nối” của tài liệu Pandas.