Mam 2 ramki danych:
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)`
i
restauracja_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)
Chciałbym połączyć te dwie ramki DataFrame, aby utworzyć pojedynczą ramkę danych za pomocą polecenia DataFrame.join () w pandach.
Wypróbowałem następujący wiersz kodu:
#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')
Ale kiedy próbuję tego, pojawia się następujący błąd:
Exception: columns overlap: Index([business_id, stars, type], dtype=object)
Jestem bardzo nowy w pandach i nie mam pojęcia, co robię źle, jeśli chodzi o wykonanie instrukcji łączenia.
jakakolwiek pomoc byłaby bardzo mile widziana.
Odpowiedzi:
Możesz użyć scalania, aby połączyć dwie ramki danych w jedną:
import pandas as pd pd.merge(restaurant_ids_dataframe, restaurant_review_frame, on='business_id', how='outer')
gdzie on określa nazwę pola, które istnieje w obu klatkach danych do połączenia, oraz jak określa, czy jego złączenie wewnętrzne / zewnętrzne / lewe / prawe, z zewnętrznym przy użyciu „unii kluczy z obu ramek (SQL: pełne sprzężenie zewnętrzne)”. Ponieważ masz kolumnę „star” w obu ramkach danych, domyślnie utworzy to dwie kolumny star_x i star_y w połączonej ramce danych. Jak @DanAllan wspomniał o metodzie łączenia, możesz modyfikować sufiksy do scalania, przekazując je jako kwarg. Domyślnie jest
suffixes=('_x', '_y')
. jeśli chciałbyś zrobić coś takiego jakstar_restaurant_id
istar_restaurant_review
, możesz zrobić:pd.merge(restaurant_ids_dataframe, restaurant_review_frame, on='business_id', how='outer', suffixes=('_restaurant_id', '_restaurant_review'))
Parametry są szczegółowo wyjaśnione w tym linku .
źródło
Łączenie kończy się niepowodzeniem, jeśli ramki DataFrames mają wspólne nazwy kolumn. Najprostszym sposobem obejścia tego jest dodanie słowa kluczowego
lsuffix
lubrsuffix
takiego:restaurant_review_frame.join(restaurant_ids_dataframe, on='business_id', how='left', lsuffix="_review")
W ten sposób kolumny mają różne nazwy. Dokumentacja dotyczy właśnie tego problemu .
Możesz też obejść ten problem, po prostu usuwając naruszające zasady kolumny przed dołączeniem. Jeśli, na przykład, gwiazdy w
restaurant_ids_dataframe
środku są zbędne w stosunku do gwiazd wrestaurant_review_frame
, możeszdel restaurant_ids_dataframe['stars']
.źródło
W przypadku, gdy ktoś musi spróbować połączyć dwie ramki danych w indeksie (zamiast innej kolumny), to również działa!
T1 i T2 to ramki danych, które mają takie same indeksy
import pandas as pd T1 = pd.merge(T1, T2, on=T1.index, how='outer')
PS Musiałem użyć scalania, ponieważ dołączanie niepotrzebnie wypełniałoby NaN.
źródło