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


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

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 dataframe usando el DataFrame.comando join () en pandas.

He intentado 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 obtengo 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 cuanto a la ejecución de la unión declaración se refiere.

Cualquier ayuda sería muy apreciada.

Author: smci, 2013-09-13

3 answers

Puedes usar merge para combinar dos dataframes en uno:

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

Donde on especifica el nombre del campo que existe en ambos dataframes para unirse, y cómo define si su unión interior / exterior / izquierda / derecha, con exterior usando ' unión de claves de ambos marcos (SQL: unión exterior completa).'Dado que tiene la columna 'star' en ambos dataframes, esto por defecto creará dos columnas star_x y star_y en el dataframe combinado. Como @ DanAllan mencionó para el método de unión, puede modifique los sufijos para combinar pasándolo como kwarg. El valor predeterminado es suffixes=('_x', '_y'). si quieres hacer algo como star_restaurant_id y 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 .

 76
Author: mlimb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-03 20:33:53

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 lsuffix o rsuffix así:

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

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

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

 17
Author: Dan Allan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-13 18:39:35

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

T1 y T2 son dataframes que tienen los mismos índices

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

P.D. Tuve que usar merge porque append llenaría NaNs innecesariamente.

 10
Author: Firas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-12 19:14:07