Sự khác biệt chính giữa hợp nhất & concat là hợp nhất cho phép bạn thực hiện "nối" các bảng có cấu trúc hơn trong đó việc sử dụng concat rộng hơn và ít cấu trúc hơn.
Hợp nhất
Tham chiếu tài liệu , pd.DataFrame.merge
lấy bên phải làm đối số bắt buộc, mà bạn có thể nghĩ nó như là kết hợp bảng bên trái và bảng bên phải theo một số thao tác nối có cấu trúc được xác định trước. Lưu ý định nghĩa cho quyền tham số .
Các thông số bắt buộc
- phải : DataFrame hoặc Series có tên
Các thông số tùy chọn
- how : {'left', 'right', 'ngoài', 'bên trong'} mặc định là 'bên trong'
- trên : nhãn hoặc danh sách
- left_on : nhãn hoặc danh sách, hoặc giống mảng
- right_on : nhãn hoặc danh sách, hoặc giống mảng
- left_index : bool, mặc định Sai
- right_index : bool, default False
- sắp xếp : bool, mặc định Sai
- các hậu tố : tuple of (str, str), default ('_x', '_y')
- copy : bool, mặc định là True
- chỉ báo : bool hoặc str, mặc định là Sai
- xác thực : str, tùy chọn
Quan trọng: pd.DataFrame.merge
yêu cầu quyền là một pd.DataFrame
hoặc pd.Series
đối tượng được đặt tên .
Đầu ra
Hơn nữa, nếu chúng tôi kiểm tra chuỗi tài liệu cho Hoạt động Hợp nhất trên gấu trúc thì bên dưới:
Thực hiện thao tác hợp nhất cơ sở dữ liệu (SQL) giữa hai đối tượng DataFrame hoặc Series bằng cách sử dụng cột làm khóa hoặc chỉ mục hàng của chúng
Concat
Tham khảo tài liệu về pd.concat
, trước tiên hãy lưu ý rằng tham số không được đặt tên là bất kỳ bảng, data_frame, chuỗi, ma trận , v.v., thay vào đó là obj . Nghĩa là, bạn có thể chuyển nhiều "vùng chứa dữ liệu", được định nghĩa là:
Iterable[FrameOrSeriesUnion], Mapping[Optional[Hashable], FrameOrSeriesUnion]
Các thông số bắt buộc
- objs : một chuỗi hoặc ánh xạ của các đối tượng Series hoặc DataFrame
Các thông số tùy chọn
- trục : {0 / 'index', 1 / 'cột'}, mặc định 0
- tham gia : {'bên trong', 'bên ngoài'}, mặc định là 'bên ngoài'
- ignore_index : bool, mặc định là Sai
- các phím : trình tự, mặc định Không có
- cấp độ : danh sách các chuỗi, mặc định Không có
- tên : danh sách, mặc định Không có
- verify_integrity : bool, default False
- sắp xếp : bool, mặc định Sai
- copy : bool, mặc định là True
Đầu ra
- Trả về : đối tượng, loại đối tượng
Thí dụ
Mã
import pandas as pd
v1 = pd.Series([1, 5, 9, 13])
v2 = pd.Series([10, 100, 1000, 10000])
v3 = pd.Series([0, 1, 2, 3])
df_left = pd.DataFrame({
"v1": v1,
"v2": v2,
"v3": v3
})
df_right = pd.DataFrame({
"v4": [5, 5, 5, 5],
"v5": [3, 2, 1, 0]
})
df_concat = pd.concat([v1, v2, v3])
merge_result = df_left.merge(df_right, left_index=True, right_index=True)
concat_result = pd.concat([df_left, df_right], sort=False)
print(merge_result)
print('='*20)
print(concat_result)
Đầu ra mã
v1 v2 v3 v4 v5
0 1 10 0 5 3
1 5 100 1 5 2
2 9 1000 2 5 1
3 13 10000 3 5 0
====================
v1 v2 v3 v4 v5
0 1.0 10.0 0.0 NaN NaN
1 5.0 100.0 1.0 NaN NaN
2 9.0 1000.0 2.0 NaN NaN
3 13.0 10000.0 3.0 NaN NaN
0 NaN NaN NaN 5.0 3.0
1 NaN NaN NaN 5.0 2.0
2 NaN NaN NaN 5.0 1.0
Tuy nhiên, bạn có thể đạt được kết quả đầu tiên (hợp nhất) với concat bằng cách thay đổi tham số trục
concat_result = pd.concat([df_left, df_right], sort=False, axis=1)
Quan sát hành vi sau đây,
concat_result = pd.concat([df_left, df_right, df_left, df_right], sort=False)
kết quả đầu ra;
v1 v2 v3 v4 v5
0 1.0 10.0 0.0 NaN NaN
1 5.0 100.0 1.0 NaN NaN
2 9.0 1000.0 2.0 NaN NaN
3 13.0 10000.0 3.0 NaN NaN
0 NaN NaN NaN 5.0 3.0
1 NaN NaN NaN 5.0 2.0
2 NaN NaN NaN 5.0 1.0
3 NaN NaN NaN 5.0 0.0
0 1.0 10.0 0.0 NaN NaN
1 5.0 100.0 1.0 NaN NaN
2 9.0 1000.0 2.0 NaN NaN
3 13.0 10000.0 3.0 NaN NaN
0 NaN NaN NaN 5.0 3.0
1 NaN NaN NaN 5.0 2.0
2 NaN NaN NaN 5.0 1.0
3 NaN NaN NaN 5.0 0.0
, bạn không thể thực hiện thao tác tương tự với hợp nhất, vì nó chỉ cho phép một DataFrame duy nhất hoặc Chuỗi được đặt tên.
merge_result = df_left.merge([df_right, df_left, df_right], left_index=True, right_index=True)
kết quả đầu ra;
TypeError: Can only merge Series or DataFrame objects, a <class 'list'> was passed
Phần kết luận
Như bạn có thể đã nhận thấy rằng đầu vào và đầu ra có thể khác nhau giữa "merge" và "concat".
Như tôi đã đề cập ở phần đầu, sự khác biệt đầu tiên (chính) là "hợp nhất" thực hiện một phép nối có cấu trúc hơn với một tập hợp các đối tượng và tham số bị hạn chế, trong đó "concat" thực hiện một phép nối ít chặt chẽ hơn / rộng hơn với một tập hợp rộng hơn của các đối tượng và tham số.
Nói chung, hợp nhất ít dung nạp hơn với các thay đổi / (đầu vào) và "concat" lỏng hơn / ít nhạy cảm hơn với các thay đổi / (đầu vào). Bạn có thể đạt được "hợp nhất" bằng cách sử dụng "concat", nhưng điều ngược lại không phải lúc nào cũng đúng.
Thao tác "Hợp nhất" sử dụng các cột Khung dữ liệu (hoặc tên của pd.Series
đối tượng) hoặc chỉ số hàng và vì chỉ sử dụng các thực thể đó nên thao tác này thực hiện hợp nhất theo chiều ngang của Khung dữ liệu hoặc Chuỗi và do đó không áp dụng thao tác dọc.
Nếu bạn muốn xem thêm, bạn có thể đi sâu vào mã nguồn một chút;
.merge()
và.join()
.