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.


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 .


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'].


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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.