Nhớ lại: Ghép nối các mảng NumPy¶
Nối Series
và DataFrame
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.concatenate
và pd.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ố join
và join_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 Series
và DataFrame
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()
và 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 và 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.