web-dev-qa-db-fra.com

Combinez deux pandas Data Frames (joindre sur une colonne commune)

J'ai 2 cadres de données:

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

et

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)

Je voudrais joindre ces deux DataFrames pour les transformer en un seul cadre de données en utilisant la commande DataFrame.join () dans les pandas.

J'ai essayé la ligne de code suivante:

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

Mais lorsque j'essaie, j'obtiens l'erreur suivante:

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

Je suis très nouveau sur pandas) et je n'ai aucune idée de ce que je fais de mal en ce qui concerne l'exécution de la déclaration de jointure.

toute aide serait très appréciée.

63
anonuser0428

Vous pouvez utiliser fusionner pour combiner deux images en une:

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

on spécifie le nom du champ qui existe dans les deux images à joindre, et comment définit si sa jointure interne/externe/gauche/droite, avec external utilisant "union des clés des deux cadres (SQL: jointure externe complète)". Puisque vous avez la colonne 'étoile' dans les deux cadres de données, cela créera par défaut deux colonnes étoile_x et étoile_y dans la trame de données combinée. Comme @DanAllan l'a mentionné pour la méthode join, vous pouvez modifier les suffixes pour la fusion en le passant sous la forme d'un kwarg. La valeur par défaut est suffixes=('_x', '_y'). si vous voulez faire quelque chose comme star_restaurant_id et star_restaurant_review, vous pouvez faire:

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

Les paramètres sont expliqués en détail dans ce lien .

93
mlimb

La jointure échoue si les DataFrames ont des noms de colonnes en commun. Le moyen le plus simple consiste à inclure un mot clé lsuffix ou rsuffix comme suit:

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

De cette façon, les colonnes ont des noms distincts. La documentation adresse ce problème même .

Vous pouvez également contourner ce problème en supprimant simplement les colonnes incriminées avant de vous rejoindre. Si, par exemple, les étoiles dans restaurant_ids_dataframe sont redondants pour les étoiles dans restaurant_review_frame, vous pourriez del restaurant_ids_dataframe['stars'].

18
Dan Allan

Au cas où quelqu'un aurait besoin d'essayer de fusionner deux images de données ensemble sur l'index (au lieu d'une autre colonne), cela fonctionne aussi!

T1 et T2 sont des trames de données qui ont les mêmes indices

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

P.S. J'ai dû utiliser merge parce que append remplirait inutilement les NaN.

11
Firas