Kombinieren Sie zwei Pandas-Datenrahmen (verbinden Sie eine gemeinsame Spalte)

85

Ich habe 2 Datenrahmen:

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

und

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)

Ich möchte diese beiden DataFrames verbinden, um sie mit dem Befehl DataFrame.join () in Pandas zu einem einzigen Datenframe zu machen.

Ich habe die folgende Codezeile ausprobiert:

#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')

Aber wenn ich das versuche, bekomme ich folgenden Fehler:

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

Ich bin sehr neu in Pandas und habe keine Ahnung, was ich falsch mache, wenn es um die Ausführung der Join-Anweisung geht.

Jede Hilfe wäre sehr dankbar.

anonuser0428
quelle
Verwandte, umfassendere Themen zum Zusammenführen von Pandas im Allgemeinen: Zusammenführen von Pandas 101 .
cs95

Antworten:

119

Mit Merge können Sie zwei Datenrahmen zu einem kombinieren:

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

Dabei gibt on den Feldnamen an, der in beiden Datenrahmen vorhanden ist, an denen verbunden werden soll, und wie definiert, ob der innere / äußere / linke / rechte Join mit dem äußeren "Vereinigung der Schlüssel aus beiden Frames" (SQL: vollständiger äußerer Join) verwendet wird. Da Sie in beiden Datenrahmen eine 'Stern'-Spalte haben, werden standardmäßig zwei Spalten star_x und star_y im kombinierten Datenrahmen erstellt. Wie @DanAllan für die Join-Methode erwähnt hat, können Sie die Suffixe für die Zusammenführung ändern, indem Sie sie als kwarg übergeben. Standard ist suffixes=('_x', '_y'). Wenn Sie so etwas wie star_restaurant_idund machen wollten star_restaurant_review, können Sie Folgendes tun:

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

Die Parameter werden in diesem Link ausführlich erläutert .

mlimb
quelle
1
Ihr Rat hat mein Problem gelöst. Die einzige Änderung, die ich vornehmen musste, war, dass ich eine innere Verschmelzung anstelle einer äußeren vorgenommen habe. dh wie = 'inner' statt äußer. Danke für Ihre Hilfe.
anonuser0428
2
wie = inner | außen | links | rechts, wie zusammengeführt, Schnittpunkt der Tasten links und rechts | Vereinigungsschlüssel (ALL) links und rechts | nur linke Tasten | nur rechte Tasten |
Gaoithe
22

Die Verknüpfung schlägt fehl, wenn die DataFrames einige Spaltennamen gemeinsam haben. Der einfachste Weg, dies zu umgehen, besteht darin, ein lsuffixoder ein rsuffixSchlüsselwort wie folgt einzufügen:

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

Auf diese Weise haben die Spalten unterschiedliche Namen. Die Dokumentation befasst sich genau mit diesem Problem .

Sie können dies auch umgehen, indem Sie einfach die fehlerhaften Spalten löschen, bevor Sie beitreten. Wenn zum Beispiel die Sterne in restaurant_ids_dataframeredundant zu den Sternen in sind restaurant_review_frame, könnten Sie del restaurant_ids_dataframe['stars'].

Dan Allan
quelle
Es heißt auch, dass sich die Spalten "business_id" überschneiden. Soll sie sich nicht überschneiden, da dies die Spalte ist, für die ich den Join erstelle? Wie gehe ich dieses Problem an?
anonuser0428
Hey @DanAllan Ich habe die Join-Methode ausprobiert, aber alles, was ich bekomme, sind 4503 Einträge im restaurant_ids_dataframe und null Einträge in den Spalten, die zum restaurant_review_frame gehören. Könnten Sie mich bitte wissen lassen, warum dies geschieht? Ich habe einen Link-Join durchgeführt, wie Sie vorgeschlagen haben, indem Sie Ihre obige Anweisung verwendet haben, aber es scheint mir aus irgendeinem Grund keine Elemente aus dem restaurant_review_frame zu geben. Ich suche nach einem Datenrahmen mit allen Spalten aus beiden Datenrahmen, die auf business_id verknüpft sind. Ich habe auch die zusätzlichen Spalten außer business_id gelöscht.
anonuser0428
Wenn Sie weiterhin daran interessiert sind, dieses Problem zu beheben, geben Sie bitte an, dass Daten das Problem reproduzieren.
Dan Allan
16

Falls jemand versuchen muss, zwei Datenrahmen im Index zusammenzuführen (anstelle einer anderen Spalte), funktioniert dies auch!

T1 und T2 sind Datenrahmen mit denselben Indizes

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

PS Ich musste Merge verwenden, da das Anhängen NaNs unnötig ausfüllen würde.

Firas
quelle