Kết hợp hai Khung dữ liệu gấu trúc (tham gia vào một cột chung)


83

Tôi có 2 khung dữ liệu:

Restaurant_ids_dataframe

Data columns (total 13 columns):
business_id      4503  non-null values
categories       4503  non-null values
city             4503  non-null values
full_address     4503  non-null values
latitude         4503  non-null values
longitude        4503  non-null values
name             4503  non-null values
neighborhoods    4503  non-null values
open             4503  non-null values
review_count     4503  non-null values
stars            4503  non-null values
state            4503  non-null values
type             4503  non-null values
dtypes: bool(1), float64(3), int64(1), object(8)`

Restaurant_review_frame

Int64Index: 158430 entries, 0 to 229905
Data columns (total 8 columns):
business_id    158430  non-null values
date           158430  non-null values
review_id      158430  non-null values
stars          158430  non-null values
text           158430  non-null values
type           158430  non-null values
user_id        158430  non-null values
votes          158430  non-null values
dtypes: int64(1), object(7)

Tôi muốn kết hợp hai DataFrame này để biến chúng thành một khung dữ liệu duy nhất bằng cách sử dụng lệnh DataFrame.join () trong gấu trúc.

Tôi đã thử dòng mã sau:

#the following line of code creates a left join of restaurant_ids_frame and   restaurant_review_frame on the column 'business_id'
restaurant_review_frame.join(other=restaurant_ids_dataframe,on='business_id',how='left')

Nhưng khi tôi thử điều này, tôi gặp lỗi sau:

Exception: columns overlap: Index([business_id, stars, type], dtype=object)

Tôi còn rất mới đối với gấu trúc và không biết tôi đang làm gì sai khi thực hiện câu lệnh tham gia.

bất kì sự trợ giúp nào đều được đánh giá cao.


Chủ đề liên quan, rộng hơn về hợp nhất gấu trúc nói chung: Pandas Merging 101 .
cs95

Câu trả lời:


118

Bạn có thể sử dụng hợp nhất để kết hợp hai khung dữ liệu thành một:

import pandas as pd
pd.merge(restaurant_ids_dataframe, restaurant_review_frame, on='business_id', how='outer')

nơi trên quy định cụ thể tên trường mà tồn tại trong cả dataframes tham gia vào, và cách định nghĩa của nó cho dù bên trong / ngoài / trái / phải tham gia, với bên ngoài sử dụng 'công đoàn các phím từ cả hai khung (SQL: đầy đủ bên ngoài tham gia).' Vì bạn có cột 'sao' trong cả hai khung dữ liệu, điều này theo mặc định sẽ tạo ra hai cột star_x và star_y trong khung dữ liệu kết hợp. Như @DanAllan đã đề cập cho phương thức nối, bạn có thể sửa đổi các hậu tố để hợp nhất bằng cách chuyển nó dưới dạng kwarg. Mặc định là suffixes=('_x', '_y'). nếu bạn muốn làm điều gì đó như star_restaurant_idstar_restaurant_review, bạn có thể làm:

 pd.merge(restaurant_ids_dataframe, restaurant_review_frame, on='business_id', how='outer', suffixes=('_restaurant_id', '_restaurant_review'))

Các thông số được giải thích chi tiết trong liên kết này .


1
Lời khuyên của bạn đã giải quyết vấn đề của tôi. Thay đổi duy nhất tôi phải thực hiện là tôi đã thực hiện hợp nhất bên trong thay vì bên ngoài. tức là how = 'bên trong' thay vì bên ngoài. Cảm ơn bạn đã giúp đỡ.
anonuser0428

2
cách = bên trong | bên ngoài | bên trái | bên phải, cách hợp nhất, giao điểm của các phím trái và phải | liên hợp (TẤT CẢ) phím trái và phải | chỉ phím trái | chỉ phím phải |
gaoithe

21

Việc tham gia không thành công nếu DataFrames có một số tên cột chung. Cách đơn giản nhất là bao gồm một lsuffixhoặc rsuffixtừ khóa như vậy:

restaurant_review_frame.join(restaurant_ids_dataframe, on='business_id', how='left', lsuffix="_review")

Bằng cách này, các cột có tên riêng biệt. Tài liệu giải quyết vấn đề này rất .

Hoặc, bạn có thể giải quyết vấn đề này bằng cách xóa các cột vi phạm trước khi tham gia. Ví dụ, nếu các ngôi sao trong restaurant_ids_dataframelà thừa so với các ngôi sao trong restaurant_review_frame, bạn có thể del restaurant_ids_dataframe['stars'].


nó cũng cho biết cột 'business_id' chồng chéo, nó không được cho là chồng chéo vì đó là cột tôi đang tạo liên kết? Làm cách nào để giải quyết vấn đề đó?
anonuser0428

Xin chào @DanAllan Tôi đã thử phương pháp tham gia nhưng tất cả những gì tôi nhận được là 4503 mục nhập trong restaurant_ids_dataframe và không có mục nhập nào trong các cột thuộc restaurant_review_frame. Bạn có thể vui lòng cho tôi biết tại sao điều này lại xảy ra không? Tôi đã thực hiện kết hợp bên trái như bạn đề xuất bằng cách sử dụng câu lệnh trên của bạn nhưng dường như nó không cung cấp cho tôi bất kỳ mục nào từ restaurant_review_frame vì một số lý do. Những gì tôi đang tìm là tạo một khung dữ liệu với tất cả các cột từ cả hai khung dữ liệu, được kết hợp trên business_id. Tôi cũng đã xóa các cột bổ sung khác ngoài business_id.
anonuser0428

Nếu bạn vẫn muốn giải quyết vấn đề này, vui lòng cung cấp ví dụ rằng dữ liệu tái tạo sự cố.
Dan Allan

16

Trong trường hợp bất kỳ ai cần thử và hợp nhất hai khung dữ liệu với nhau trên chỉ mục (thay vì một cột khác), điều này cũng hoạt động!

T1 và T2 là các khung dữ liệu có cùng chỉ số

import pandas as pd
T1 = pd.merge(T1, T2, on=T1.index, how='outer')

Tái bút Tôi đã phải sử dụng hợp nhất vì nối thêm sẽ điền NaN vào không cần thiết.

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.