Połącz dwie pandy Data Frames (połącz we wspólnej kolumnie)


86

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.


Powiązany, szerszy temat dotyczący łączenia się pand w ogóle: Pandas Merging 101 .
cs95

Odpowiedzi:


122

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 jak star_restaurant_idi star_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 .


1
Twoja rada rozwiązała mój problem. Jedyną zmianą, jaką musiałem dokonać, było wewnętrzne scalenie zamiast zewnętrznego. czyli jak = „wewnętrzny” zamiast „zewnętrzny”. Dzięki za pomoc.
anonuser0428

2
jak = wewnętrzny | zewnętrzny | lewy | prawy, jak łączyć, przecinanie się klawiszy lewy i prawy | Union (WSZYSTKIE) klawisze lewy i prawy | tylko lewy klawisz | tylko prawy klawisz |
gaoithe

22

Łączenie kończy się niepowodzeniem, jeśli ramki DataFrames mają wspólne nazwy kolumn. Najprostszym sposobem obejścia tego jest dodanie słowa kluczowego lsuffixlub rsuffixtakiego:

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 w restaurant_review_frame, możesz del restaurant_ids_dataframe['stars'].


mówi również, że kolumna „business_id” nakłada się, czy nie powinna się pokrywać, ponieważ jest to kolumna, na której tworzę złączenie? Jak mam rozwiązać ten problem?
anonuser0428

Hej @DanAllan Próbowałem metody łączenia, ale otrzymałem tylko 4503 wpisy w restaurant_ids_dataframe i zero wpisów w kolumnach należących do restaurant_review_frame. Czy mógłbyś dać mi znać, dlaczego tak się dzieje? Wykonałem łączenie lewostronne, jak zasugerowałeś, używając powyższego stwierdzenia, ale z jakiegoś powodu nie wydaje mi się, aby dało mi to żadne elementy z restaurant_review_frame. To, czego szukam, to utworzenie ramki danych ze wszystkimi kolumnami z obu ramek danych, połączonych na business_id. Usunąłem również dodatkowe kolumny inne niż business_id.
anonuser0428

Jeśli nadal jesteś zainteresowany rozwiązaniem tego problemu, podaj przykład, że dane odtwarzają problem.
Dan Allan,

16

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.