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