Combine dos marcos de datos de pandas (únase en una columna común)

83

Tengo 2 marcos de datos:

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

y

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)

Me gustaría unir estos dos DataFrames para convertirlos en un solo marco de datos usando el comando DataFrame.join () en pandas.

He probado la siguiente línea de código:

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

Pero cuando intento esto, aparece el siguiente error:

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

Soy muy nuevo en pandas y no tengo ni idea de lo que estoy haciendo mal en lo que respecta a la ejecución de la declaración de unión.

cualquier ayuda sería muy apreciada.

anonuser0428
fuente
Tema relacionado y más amplio sobre la fusión de pandas en general: Pandas Merging 101 .
cs95

Respuestas:

118

Puede usar la combinación para combinar dos marcos de datos en uno:

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

donde en especifica el nombre del campo que existe en ambas tramas de datos para unirse a, y cómo define si el interno / externo / izquierda / derecha se unen, con el exterior mediante 'unión de las claves de ambos marcos (SQL: externa completa).' Dado que tiene la columna 'estrella' en ambos marcos de datos, esto creará de forma predeterminada dos columnas star_x y star_y en el marco de datos combinado. Como mencionó @DanAllan para el método de unión, puede modificar los sufijos para fusionar pasándolo como kwarg. El valor predeterminado es suffixes=('_x', '_y'). si quisieras hacer algo como star_restaurant_idy star_restaurant_review, puedes hacer:

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

Los parámetros se explican en detalle en este enlace .

mlimb
fuente
1
Tu consejo resolvió mi problema. El único cambio que tuve que hacer fue hacer una fusión interna en lugar de externa. es decir, cómo = 'interior' en lugar de exterior. Gracias por tu ayuda.
anonuser0428
2
cómo = interior | exterior | izquierda | derecha, cómo fusionar, intersección de teclas izquierda y derecha | unión (TODAS) teclas izquierda y derecha | solo teclas izquierda | solo teclas derecha |
gaoithe
21

La unión falla si los DataFrames tienen algunos nombres de columna en común. La forma más sencilla de evitarlo es incluir una palabra clave lsuffixo rsuffixcomo esta:

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

De esta forma, las columnas tienen nombres distintos. La documentación aborda este mismo problema .

O bien, puede evitar esto simplemente eliminando las columnas ofensivas antes de unirse. Si, por ejemplo, las estrellas en restaurant_ids_dataframeson redundantes a las estrellas en restaurant_review_frame, podría hacerlo del restaurant_ids_dataframe['stars'].

Dan Allan
fuente
también dice que la columna 'business_id' se superpone, ¿no se supone que se superponga ya que esa es la columna en la que estoy creando la combinación? ¿Cómo abordo ese problema?
anonuser0428
Hola @DanAllan Probé el método de unión, pero todo lo que obtengo son 4503 entradas en restaurant_ids_dataframe y cero entradas en las columnas que pertenecen a restaurant_review_frame. ¿Podría decirme por qué está sucediendo esto? He realizado una unión a la izquierda como sugirió usando su declaración anterior, pero no parece darme ningún elemento del restaurant_review_frame por alguna razón. Lo que estoy buscando es crear un marco de datos con todas las columnas de ambos marcos de datos, unidas en business_id. También eliminé las columnas adicionales que no sean business_id.
anonuser0428
Si aún está interesado en resolver esto, proporcione un ejemplo de que los datos reproducen el problema.
Dan Allan
16

En caso de que alguien necesite intentar fusionar dos marcos de datos en el índice (en lugar de otra columna), ¡esto también funciona!

T1 y T2 son marcos de datos que tienen los mismos índices

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

PD: tuve que usar merge porque append llenaría los NaN innecesariamente.

Firas
fuente