108 votes

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

J'ai 2 dataframes :

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

Cadre d'évaluation des restaurants

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 à l'aide de la commande DataFrame.join() dans 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 de le faire, j'obtiens l'erreur suivante :

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

Je suis très novice en matière de pandas et je n'ai aucune idée de ce que je fais de mal en ce qui concerne l'exécution de l'instruction de jointure.

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

159voto

mlimb Points 1063

Vous pouvez utiliser fusionner pour combiner deux cadres de données en un seul :

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

donde sur spécifie le nom du champ qui existe dans les deux cadres de données à joindre, et comment définit s'il s'agit d'une jointure interne/externe/gauche/droite, l'externe utilisant "l'union des clés des deux cadres (SQL : jointure externe complète)". Puisque vous avez la colonne 'star' dans les deux cadres de données, cela créera par défaut deux colonnes star_x et star_y dans le cadre de données combiné. Comme @DanAllan l'a mentionné pour la méthode de jointure, vous pouvez modifier les suffixes pour la fusion en les passant comme un kwarg. La valeur par défaut est suffixes=('_x', '_y') . si vous vouliez faire quelque chose comme star_restaurant_id y star_restaurant_review que 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 .

26voto

Dan Allan Points 6172

La jointure échoue si les DataFrames ont certains noms de colonnes en commun. Le moyen le plus simple de contourner ce problème est d'inclure une balise lsuffix o rsuffix mot-clé comme ceci :

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 traite précisément de ce problème .

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

20voto

Firas Points 380

Si quelqu'un a besoin d'essayer de fusionner deux cadres de données ensemble sur l'index (au lieu d'une autre colonne), cela fonctionne également !

T1 et T2 sont des cadres 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 aurait rempli des NaNs inutilement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X