Python Pandas - Fusionar / Unir
Pandas tiene operaciones de unión en memoria con todas las funciones y alto rendimiento idiomáticamente muy similares a las bases de datos relacionales como SQL.
Pandas proporciona una sola función, merge, como punto de entrada para todas las operaciones de unión de bases de datos estándar entre objetos DataFrame -
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,
left_index=False, right_index=False, sort=True)
Aquí, hemos utilizado los siguientes parámetros:
left - Un objeto DataFrame.
right - Otro objeto DataFrame.
on- Columnas (nombres) para unirse. Debe encontrarse en los objetos DataFrame izquierdo y derecho.
left_on- Columnas del DataFrame izquierdo para usar como claves. Pueden ser nombres de columna o matrices con una longitud igual a la longitud del DataFrame.
right_on- Columnas del DataFrame correcto para usar como claves. Pueden ser nombres de columna o matrices con una longitud igual a la longitud del DataFrame.
left_index - si True,use el índice (etiquetas de fila) del DataFrame izquierdo como su (s) clave (s) de combinación. En el caso de un DataFrame con un MultiIndex (jerárquico), el número de niveles debe coincidir con el número de claves de combinación del DataFrame correcto.
right_index - Mismo uso que left_index para el DataFrame correcto.
how- Uno de 'izquierda', 'derecha', 'exterior', 'interior'. El valor predeterminado es interno. Cada método se describe a continuación.
sort- Ordene el DataFrame de resultado por las claves de combinación en orden lexicográfico. El valor predeterminado es Verdadero, si se establece en Falso mejorará sustancialmente el rendimiento en muchos casos.
Creemos ahora dos DataFrames diferentes y realicemos las operaciones de fusión en ellos.
# import the pandas library
import pandas as pd
left = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame(
{'id':[1,2,3,4,5],
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print left
print right
Sus output es como sigue -
Name id subject_id
0 Alex 1 sub1
1 Amy 2 sub2
2 Allen 3 sub4
3 Alice 4 sub6
4 Ayoung 5 sub5
Name id subject_id
0 Billy 1 sub2
1 Brian 2 sub4
2 Bran 3 sub3
3 Bryce 4 sub6
4 Betty 5 sub5
Fusionar dos DataFrames en una clave
import pandas as pd
left = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left,right,on='id')
Sus output es como sigue -
Name_x id subject_id_x Name_y subject_id_y
0 Alex 1 sub1 Billy sub2
1 Amy 2 sub2 Brian sub4
2 Allen 3 sub4 Bran sub3
3 Alice 4 sub6 Bryce sub6
4 Ayoung 5 sub5 Betty sub5
Fusionar dos DataFrames en varias claves
import pandas as pd
left = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left,right,on=['id','subject_id'])
Sus output es como sigue -
Name_x id subject_id Name_y
0 Alice 4 sub6 Bryce
1 Ayoung 5 sub5 Betty
Fusionar usando el argumento 'cómo'
los howEl argumento para fusionar especifica cómo determinar qué claves se incluirán en la tabla resultante. Si una combinación de teclas no aparece en las tablas de la derecha o de la izquierda, los valores de la tabla combinada serán NA.
Aquí hay un resumen de how opciones y sus nombres equivalentes SQL -
Método de fusión | Equivalente de SQL | Descripción |
---|---|---|
izquierda | IZQUIERDA COMBINACIÓN EXTERNA | Usar teclas del objeto izquierdo |
derecho | UNIÓN EXTERIOR DERECHA | Usar claves del objeto correcto |
exterior | UNIÓN EXTERIOR COMPLETA | Usar unión de claves |
interior | UNIR INTERNAMENTE | Usar intersección de llaves |
Unión a la izquierda
import pandas as pd
left = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left, right, on='subject_id', how='left')
Sus output es como sigue -
Name_x id_x subject_id Name_y id_y
0 Alex 1 sub1 NaN NaN
1 Amy 2 sub2 Billy 1.0
2 Allen 3 sub4 Brian 2.0
3 Alice 4 sub6 Bryce 4.0
4 Ayoung 5 sub5 Betty 5.0
Unión derecha
import pandas as pd
left = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left, right, on='subject_id', how='right')
Sus output es como sigue -
Name_x id_x subject_id Name_y id_y
0 Amy 2.0 sub2 Billy 1
1 Allen 3.0 sub4 Brian 2
2 Alice 4.0 sub6 Bryce 4
3 Ayoung 5.0 sub5 Betty 5
4 NaN NaN sub3 Bran 3
Unión externa
import pandas as pd
left = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left, right, how='outer', on='subject_id')
Sus output es como sigue -
Name_x id_x subject_id Name_y id_y
0 Alex 1.0 sub1 NaN NaN
1 Amy 2.0 sub2 Billy 1.0
2 Allen 3.0 sub4 Brian 2.0
3 Alice 4.0 sub6 Bryce 4.0
4 Ayoung 5.0 sub5 Betty 5.0
5 NaN NaN sub3 Bran 3.0
Unir internamente
La unión se realizará en index. La operación de unión respeta el objeto en el que se llama. Entonces,a.join(b) no es igual a b.join(a).
import pandas as pd
left = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left, right, on='subject_id', how='inner')
Sus output es como sigue -
Name_x id_x subject_id Name_y id_y
0 Amy 2 sub2 Billy 1
1 Allen 3 sub4 Brian 2
2 Alice 4 sub6 Bryce 4
3 Ayoung 5 sub5 Betty 5