Sự khác biệt giữa merge () và concat () ở gấu trúc


85

Sự khác biệt cơ bản giữa pd.DataFrame.merge()và là pd.concat()gì?

Cho đến nay, đây là những gì tôi tìm thấy, vui lòng nhận xét về mức độ hiểu biết của tôi đầy đủ và chính xác:

  • .merge()chỉ có thể sử dụng các cột (cộng với chỉ số hàng) và nó phù hợp về mặt ngữ nghĩa cho các hoạt động kiểu cơ sở dữ liệu. .concat()có thể được sử dụng với một trong hai trục, chỉ sử dụng các chỉ số và cung cấp tùy chọn để thêm chỉ mục phân cấp.

  • Ngẫu nhiên, điều này cho phép dư thừa sau: cả hai đều có thể kết hợp hai khung dữ liệu bằng cách sử dụng các chỉ số hàng.

  • pd.DataFrame.join() chỉ cung cấp cách viết tắt cho một tập hợp con các trường hợp sử dụng của .merge()

(Pandas rất giỏi trong việc giải quyết rất nhiều trường hợp sử dụng trong phân tích dữ liệu. Có thể hơi khó khăn khi khám phá tài liệu để tìm ra cách tốt nhất để thực hiện một tác vụ cụ thể.)


3
Ngoài ra, liên quan: stackoverflow.com/a/37891437/1972495 một cuộc thảo luận xung quanh .merge().join().
WindChimes

2
Khi hợp nhất, nối và nối, tôi thấy câu trả lời này rất rõ ràng về cách tất cả chúng có thể được sử dụng để làm cùng một thứ (chúng dường như chỉ là giao diện thay thế cho cùng một chức năng). Nhờ câu hỏi của bạn (và câu trả lời mà bạn liên kết trong nhận xét), tôi biết cuối cùng tôi đã hiểu cách hợp nhất và tham gia có liên quan như thế nào. Vẫn chưa rõ ràng với tôi nếu concat sử dụng một thực hiện khác nhau hay không (tôi đoán tôi sẽ phải nhìn vào mã nguồn ...)
pietroppeter

Câu trả lời:


77

Sự khác biệt ở mức rất cao merge()được sử dụng để kết hợp hai (hoặc nhiều) khung dữ liệu trên cơ sở giá trị của các cột chung (cũng có thể sử dụng các chỉ số, sử dụng left_index=Truevà / hoặc right_index=True) và concat()được sử dụng để nối một (hoặc nhiều) khung dữ liệu vào một bên dưới cái kia (hoặc sang một bên, tùy thuộc vào việc axistùy chọn được đặt thành 0 hay 1).

join()được sử dụng để hợp nhất 2 khung dữ liệu trên cơ sở chỉ mục; thay vì sử dụng merge()với tùy chọn left_index=Truechúng ta có thể sử dụng join().

Ví dụ:

df1 = pd.DataFrame({'Key': ['b', 'b', 'a', 'c', 'a', 'a', 'b'], 'data1': range(7)})

df1:
   Key  data1
0   b   0
1   b   1
2   a   2
3   c   3
4   a   4
5   a   5
6   b   6

df2 = pd.DataFrame({'Key': ['a', 'b', 'd'], 'data2': range(3)})

df2:
    Key data2
0   a   0
1   b   1
2   d   2

#Merge
# The 2 dataframes are merged on the basis of values in column "Key" as it is 
# a common column in 2 dataframes

pd.merge(df1, df2)

   Key data1 data2
0   b    0    1
1   b    1    1
2   b    6    1
3   a    2    0
4   a    4    0
5   a    5    0

#Concat
# df2 dataframe is appended at the bottom of df1 

pd.concat([df1, df2])

   Key data1 data2
0   b   0     NaN
1   b   1     NaN
2   a   2     NaN
3   c   3     NaN
4   a   4     NaN
5   a   5     NaN
6   b   6     NaN
0   a   Nan   0
1   b   Nan   1
2   d   Nan   2

Vì vậy, điều này có nghĩa là lập luận howtrong mergehoạt động và có nghĩa là hoàn toàn khác với những gì nó làm trong concat?
Hemanth Bakaya

11

pd.concatlấy một Iterablelàm đối số của nó. Do đó, nó không thể lấy DataFrames trực tiếp làm đối số của nó. Ngoài ra, Dimensions trong số DataFramephải khớp dọc theo trục trong khi nối.

pd.mergecó thể lấy DataFrames làm đối số của nó và được sử dụng để kết hợp hai DataFrames có cùng cột hoặc chỉ mục, điều này không thể thực hiện được pd.concatvì nó sẽ hiển thị cột lặp lại trong DataFrame.

Trong khi phép nối có thể được sử dụng để nối hai DataFrames với các chỉ số khác nhau.


7
Tôi thích câu trả lời này vì nó cho biết các kích thước phải khớp khi nối. concatkhông có gì khác hơn là dán một số khung dữ liệu lên trên / bên cạnh nhau. Nó không nhận thức được nội dung theo nghĩa là nó sẽ chỉ hiển thị cùng một cột hai lần. Trong khi mergethực sự sẽ hợp nhất các cột khi chúng giống nhau.
jorijnsmit

2
Tôi nghĩ nó không đúng. Ngay cả câu trả lời ở trên (của @Abhishek Sawant) cũng đưa ra một ví dụ về concatnơi các thứ nguyên không khớp.
michcio1234

7

Tôi hiện đang cố gắng hiểu (các) sự khác biệt cơ bản giữa pd.DataFrame.merge()pd.concat().

Câu hỏi hay đấy. Điểm khác biệt chính:

pd.concat hoạt động trên cả hai trục.

Sự khác biệt khác, là chỉ pd.concatcác phép nối mặc định bên trongbên ngoài , trong khi pd.DataFrame.merge()có các phép nối mặc định bên trái , bên phải , bên ngoài , bên trong .

Điểm khác biệt đáng chú ý thứ ba là: pd.DataFrame.merge()có tùy chọn đặt các hậu tố cột khi hợp nhất các cột có cùng tên, trong khi pd.concatđiều này là không thể.


Với pd.concattheo mặc định, bạn có thể xếp chồng các hàng của nhiều khung dữ liệu ( axis=0) và khi bạn đặt axis=1thì bạn bắt chước pd.DataFrame.merge()hàm.

Một số ví dụ hữu ích về pd.concat:

df2=pd.concat([df]*2, ignore_index=True) #double the rows of a dataframe

df2=pd.concat([df, df.iloc[[0]]]) # add first row to the end

df3=pd.concat([df1,df2], join='inner', ignore_index=True) # concat two df's

5

Ở một cấp độ cao:

  • .concat()chỉ cần xếp chồng nhiều DataFramevới nhau theo chiều dọc hoặc khâu theo chiều ngang sau khi căn chỉnh trên chỉ mục
  • .merge()đầu tiên căn chỉnh hai DataFrame'cột hoặc chỉ mục chung đã chọn, sau đó chọn các cột còn lại từ các hàng đã căn chỉnh của mỗi cột DataFrame.

Cụ thể hơn, .concat():

  • Là một hàm gấu trúc cấp cao nhất
  • Kết hợp hai hoặc nhiều gấu trúc DataFrame theo chiều dọc hoặc chiều ngang
  • Canh lề chỉ trên chỉ số khi kết hợp theo chiều ngang
  • Lỗi khi bất kỳ mục nào DataFramechứa chỉ mục trùng lặp.
  • Mặc định là tham gia bên ngoài với tùy chọn tham gia bên trong

.merge():

  • Tồn tại cả dưới dạng hàm gấu trúc cấp cao nhất và một DataFramephương thức (kể từ pandas 1.0)
  • Kết hợp chính xác hai DataFrametheo chiều ngang
  • Canh lề sự kêu gọi DataFramecủa cột (s) hoặc index với người khác DataFrame'cột s (s) hoặc index
  • Xử lý các giá trị trùng lặp trên các cột hoặc chỉ mục tham gia bằng cách thực hiện một sản phẩm cacte
  • Mặc định là kết hợp bên trong với các tùy chọn cho bên trái, bên ngoài và bên phải

Lưu ý rằng khi thực hiện pd.merge(left, right), nếu leftcó hai hàng chứa các giá trị giống nhau từ các cột hoặc chỉ mục tham gia, mỗi hàng sẽ kết hợp với right(các) hàng tương ứng của nó, dẫn đến một sản phẩm theo mô-đun. Mặt khác, nếu .concat()được sử dụng để kết hợp các cột, chúng ta cần đảm bảo rằng không có chỉ mục trùng lặp nào tồn tại trong cả hai DataFrame.

Nói thực tế:

  • Xem xét .concat()đầu tiên khi kết hợp đồng nhất DataFrame, trong khi xem xét .merge()đầu tiên khi kết hợp bổ sung DataFrame.
  • Nếu cần hợp nhất theo chiều dọc, hãy đi với .concat(). Nếu cần hợp nhất theo chiều ngang qua các cột, hãy chọn .merge(), theo mặc định sẽ hợp nhất trên các cột chung.

Tham khảo: Sách dạy nấu ăn Pandas 1.x


2

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.mergelấ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.DataFramehoặc pd.Seriesđối tượng được đặt tên .

Đầu ra

  • Trả về : DataFrame

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ụ

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])

# Performing operations on default

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;


-2

theo mặc định:
tham gia là tham gia bên trái theo cột khôn ngoan
pd.merge là tham gia bên trong theo cột khôn ngoan
pd.concat là tham gia bên ngoài theo hàng khôn ngoan

pd.concat:
nhận các đối số có thể lặp lại . Do đó, nó không thể lấy DataFrame trực tiếp (sử dụng [df, df2])
Kích thước của DataFrame phải khớp dọc theo trục

Tham gia và pd.merge:
có thể lấy các đối số DataFrame

Nhấp để xem hình ảnh để hiểu tại sao mã bên dưới hoạt động tương tự

df1.join(df2)
pd.merge(df1, df2, left_index=True, right_index=True)
pd.concat([df1, df2], axis=1)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.