Saltar al contenido principal
InicioTutorialesPython

Tutorial de unión de DataFrames en pandas

En este tutorial, usted aprenderá varias maneras en las que múltiples DataFrames pueden ser fusionados en python usando la librería Pandas.
may 2024  · 19 min leer

¿Has intentado alguna vez resolver un reto de Kaggle? En caso afirmativo, es posible que se haya dado cuenta de que, en la mayoría de los desafíos, los datos que se le proporcionan están presentes en varios archivos, y algunas de las columnas están presentes en más de uno de los archivos. ¿Qué es lo primero que le viene a la mente? Únase a ellos, por supuesto.

En este tutorial, practicarás algunas técnicas estándar de unión de pandas. Más concretamente, aprenderás a:

  • Concatenar DataFrames a lo largo de fila y columna.
  • Fusione DataFrames en claves específicas mediante diferentes lógicas de unión como left-join, inner-join, etc.
  • Unir DataFrames por índice.
  • Fusión de series temporales en pandas

Por el camino, también aprenderás algunos trucos que necesitarás antes y después de unirte.

Pandas que se unen

Unir y fusionar DataFrames es el proceso central para comenzar con el análisis de datos y las tareas de aprendizaje automático. Es uno de los conjuntos de herramientas que todo analista o científico de datos debe dominar porque, en casi todos los casos, los datos proceden de múltiples fuentes y archivos. Es posible que tenga que reunir todos los datos en un solo lugar mediante algún tipo de lógica de unión y, a continuación, iniciar el análisis. Quienes trabajen con lenguajes de consulta tipo SQL quizá conozcan la importancia de esta tarea. Incluso si desea construir algunos modelos de aprendizaje automático en algunos datos, puede que tenga que combinar varios archivos csv juntos en un único DataFrame.

pandas proporciona varias facilidades para combinar fácilmente objetos Series, DataFrames y Panel con varios tipos de lógica de conjuntos para los índices y funcionalidad de álgebra relacional en el caso de operaciones de tipo join / merge.

Run and edit the code from this tutorial online

Run Code

pandas Concatenar

Comienza importando la biblioteca que utilizarás a lo largo del tutorial: pandas

import pandas as pd

Realizará todas las operaciones de este tutorial en los DataFrames ficticios que creará. Para crear un DataFrame, puede utilizar un diccionario Python como:

dummy_data1 = {
        'id': ['1', '2', '3', '4', '5'],
        'Feature1': ['A', 'C', 'E', 'G', 'I'],
        'Feature2': ['B', 'D', 'F', 'H', 'J']}

Aquí, las claves del diccionario dummy_data1 son los nombres de las columnas, y los valores de la lista son los datos correspondientes a cada observación o fila. Para transformar esto en un DataFrame de pandas, utilizarás la función DataFrame() de pandas, junto con su argumento columns para nombrar tus columnas:

df1 = pd.DataFrame(dummy_data1, columns = ['id', 'Feature1', 'Feature2'])

df1
  id Artículo1 Artículo2
0 1 A B
1 2 C D
2 3 E F
3 4 G H
4 5 I J

Como puede observar, ahora tiene un DataFrame con tres columnas id, Feature1 y Feature2. Hay una columna adicional sin nombre que pandas crea intrínsecamente como etiquetas de las filas. De forma similar al DataFrame anterior df1, creará otros dos DataFrames df2 y df3 :

dummy_data2 = {
        'id': ['1', '2', '6', '7', '8'],
        'Feature1': ['K', 'M', 'O', 'Q', 'S'],
        'Feature2': ['L', 'N', 'P', 'R', 'T']}
df2 = pd.DataFrame(dummy_data2, columns = ['id', 'Feature1', 'Feature2'])

df2
  id Artículo1 Artículo2
0 1 K L
1 2 M N
2 6 O P
3 7 Q R
4 8 S T
dummy_data3 = {
        'id': ['1', '2', '3', '4', '5', '7', '8', '9', '10', '11'],
        'Feature3': [12, 13, 14, 15, 16, 17, 15, 12, 13, 23]}
df3 = pd.DataFrame(dummy_data3, columns = ['id', 'Feature3'])

df3
  id Feature3
0 1 12
1 2 13
2 3 14
3 4 15
4 5 16
5 7 17
6 8 15
7 9 12
8 10 13
9 11 23

 concat()

Para concatenar simplemente los DataFrames a lo largo de la fila se puede utilizar la función concat() en pandas. Tendrás que pasar los nombres de los DataFrames en una lista como argumento a la función concat():

df_row = pd.concat([df1, df2])

df_row
  id Artículo1 Artículo2
0 1 A B
1 2 C D
2 3 E F
3 4 G H
4 5 I J
0 1 K L
1 2 M N
2 6 O P
3 7 Q R
4 8 S T

Puede observar que los dos DataFrames df1 y df2 están ahora concatenados en un único DataFrame df_row a lo largo de la fila. Sin embargo, las etiquetas de las filas parecen estar mal. Si desea que las etiquetas de las filas se ajusten automáticamente en función de la unión, deberá establecer el argumento ignore_index como True al llamar a la función concat():

df_row_reindex = pd.concat([df1, df2], ignore_index=True)

df_row_reindex
  id Artículo1 Artículo2
0 1 A B
1 2 C D
2 3 E F
3 4 G H
4 5 I J
5 1 K L
6 2 M N
7 6 O P
8 7 Q R
9 8 S T

Ahora las etiquetas de las filas son correctas.

pandas también le proporciona una opción para etiquetar los DataFrames, después de la concatenación, con una clave para que pueda saber qué datos proceden de qué DataFrame. Puede conseguir lo mismo pasando claves de argumentos adicionales que especifiquen los nombres de las etiquetas de los DataFrames en una lista. Aquí se realizará la misma concatenación con claves como x e y para los DataFrames df1 y df2 respectivamente.

frames = [df1,df2]
df_keys = pd.concat(frames, keys=['x', 'y'])

df_keys
    id Artículo1 Artículo2
x 0 1 A B
1 2 C D
2 3 E F
3 4 G H
4 5 I J
y 0 1 K L
1 2 M N
2 6 O P
3 7 Q R
4 8 S T

La mención de las claves también facilita la recuperación de los datos correspondientes a un DataFrame concreto. Puedes recuperar los datos del DataFrame df2 que tenía la etiqueta y utilizando el método loc:

df_keys.loc['y']
  id Artículo1 Artículo2
0 1 K L
1 2 M N
2 6 O P
3 7 Q R
4 8 S T

También puede pasar un diccionario a concat(), en cuyo caso las claves del diccionario se utilizarán para el argumento claves (a menos que se especifiquen otras claves):

pieces = {'x': df1, 'y': df2}

df_piece = pd.concat(pieces)

df_piece
    id Artículo1 Artículo2
x 0 1 A B
1 2 C D
2 3 E F
3 4 G H
4 5 I J
y 0 1 K L
1 2 M N
2 6 O P
3 7 Q R
4 8 S T

Hay que tener en cuenta que concat() hace una copia completa de los datos, por lo que la reutilización continua de esta función puede afectar significativamente al rendimiento. Si necesita utilizar la operación en varios conjuntos de datos, utilice una comprensión de lista.

frames = [ process_your_file(f) for f in files ]
result = pd.concat(frames)

Para concatenar DataFrames a lo largo de una columna, puede especificar el parámetro de eje como 1 :

df_col = pd.concat([df1,df2], axis=1)

df_col
  id Artículo1 Artículo2 id Artículo1 Artículo2
0 1 A B 1 K L
1 2 C D 2 M N
2 3 E F 6 O P
3 4 G H 7 Q R
4 5 I J 8 S T

pandas Combinar marcos de datos

Otra operación omnipresente relacionada con los DataFrames es la operación de fusión. Dos DataFrames pueden contener diferentes tipos de información sobre la misma entidad y estar vinculados por alguna característica/columna común. Para unir estos DataFrames, pandas proporciona múltiples funciones como concat(), merge() , join(), etc. En esta sección, practicarás el uso de la función merge() de pandas.

Puede unir DataFrames df_row (que creó concatenando df1 y df2 a lo largo de la fila) y df3 en la columna común (o clave) id. Para ello, pase los nombres de los DataFrames y un argumento adicional como el nombre de la columna común, aquí id, a la función merge():

df_merge_col = pd.merge(df_row, df3, on='id')

df_merge_col
  id Artículo1 Artículo2 Feature3
0 1 A B 12
1 1 K L 12
2 2 C D 13
3 2 M N 13
4 3 E F 14
5 4 G H 15
6 5 I J 16
7 7 Q R 17
8 8 S T 15

Puede observar que los DataFrames se han fusionado en un único DataFrame basado en los valores comunes presentes en la columna id de ambos DataFrames. Por ejemplo, aquí el valor de id 1 estaba presente tanto con A, B como con K, L en el DataFrame df_row, por lo que este id se repitió dos veces en el DataFrame final df_merge_col con el valor repetido 12 de Feature3 que procedía del DataFrame df3.

Puede ocurrir que la columna en la que desea combinar los DataFrames tenga nombres diferentes (a diferencia de este caso). Para estas fusiones, tendrá que especificar los argumentos left_on como nombre del DataFrame izquierdo y right_on como nombre del DataFrame derecho, como :

df_merge_difkey = pd.merge(df_row, df3, left_on='id', right_on='id')

df_merge_difkey
  id Artículo1 Artículo2 Feature3
0 1 A B 12
1 1 K L 12
2 2 C D 13
3 2 M N 13
4 3 E F 14
5 4 G H 15
6 5 I J 16
7 7 Q R 17
8 8 S T 15

También puede añadir filas a un DataFrame pasando una Serie o dict a la función append() que devuelve un nuevo DataFrame:

add_row = pd.Series(['10', 'X1', 'X2', 'X3'],
                    index=['id','Feature1', 'Feature2', 'Feature3'])

df_add_row = df_merge_col.append(add_row, ignore_index=True)

df_add_row
  id Artículo1 Artículo2 Feature3
0 1 A B 12
1 1 K L 12
2 2 C D 13
3 2 M N 13
4 3 E F 14
5 4 G H 15
6 5 I J 16
7 7 Q R 17
8 8 S T 15
9 10 X1 X2 X3

Tipos de pandas Unirse

En esta sección, practicará las distintas lógicas de unión disponibles para fusionar DataFrames de pandas basándose en alguna columna/clave común. La lógica que subyace a estas uniones es muy parecida a la que existe en SQL cuando se unen tablas.

Unión exterior completa

El FULL OUTER JOIN combina los resultados de los outer joins izquierdo y derecho. El DataFrame unido contendrá todos los registros de ambos DataFrames y rellenará con NaNs las coincidencias que falten en cada lado. Puede realizar una unión externa completa especificando el argumento how como outer en la función merge():

df_outer = pd.merge(df1, df2, on='id', how='outer')

df_outer
  id Feature1_x Feature2_x Feature1_y Feature2_y
0 1 A B K L
1 2 C D M N
2 3 E F NaN NaN
3 4 G H NaN NaN
4 5 I J NaN NaN
5 6 NaN NaN O P
6 7 NaN NaN Q R
7 8 NaN NaN S T

Puede observar que el DataFrame resultante tenía todas las entradas de ambas tablas con valores NaN para las coincidencias que faltaban a cada lado. Sin embargo, otra cosa que hay que tener en cuenta es el sufijo que se añade a los nombres de las columnas para indicar qué columna procede de qué DataFrame. Los sufijos por defecto son x e y, sin embargo, puede modificarlos especificando el argumento suffixes en la función merge():

df_suffix = pd.merge(df1, df2, left_on='id',right_on='id',how='outer',suffixes=('_left','_right'))

df_suffix
  id Feature1_left Feature2_left Feature1_right Feature2_right
0 1 A B K L
1 2 C D M N
2 3 E F NaN NaN
3 4 G H NaN NaN
4 5 I J NaN NaN
5 6 NaN NaN O P
6 7 NaN NaN Q R
7 8 NaN NaN S T

Unión interna

El INNER JOIN produce sólo el conjunto de registros que coinciden tanto en el DataFrame A como en el DataFrame B. Tiene que pasar inner en el argumento how de la función merge() para hacer inner join:

df_inner = pd.merge(df1, df2, on='id', how='inner')

df_inner
  id Feature1_x Feature2_x Feature1_y Feature2_y
0 1 A B K L
1 2 C D M N

Derecha Únete

El RIGHT JOIN produce un conjunto completo de registros del DataFrame B (DataFrame derecho), con los registros coincidentes (si están disponibles) en el DataFrame A (DataFrame izquierdo). Si no hay ninguna coincidencia, el lado derecho contendrá null. Tienes que pasar el argumento how en la función merge() para hacer la unión correcta:

df_right = pd.merge(df1, df2, on='id', how='right')

df_right
  id Feature1_x Feature2_x Feature1_y Feature2_y
0 1 A B K L
1 2 C D M N
2 6 NaN NaN O P
3 7 NaN NaN Q R
4 8 NaN NaN S T

Unión izquierda

El LEFT JOIN produce un conjunto completo de registros del DataFrame A (DataFrame izquierdo), con los registros coincidentes (si están disponibles) en el DataFrame B (DataFrame derecho). Si no hay ninguna coincidencia, el lado izquierdo contendrá null. Tienes que pasar left en el argumento how de la función merge() para hacer left join:

df_left = pd.merge(df1, df2, on='id', how='left')

df_left
  id Feature1_x Feature2_x Feature1_y Feature2_y
0 1 A B K L
1 2 C D M N
2 3 E F NaN NaN
3 4 G H NaN NaN
4 5 I J NaN NaN

Unir en índice

A veces puede que tenga que realizar la unión en los índices o en las etiquetas de las filas. Para ello, debe especificar right_index (para los índices del DataFrame derecho) e left_index (para los índices del DataFrame izquierdo) como True :

df_index = pd.merge(df1, df2, right_index=True, left_index=True)

df_index
  id_x Feature1_x Feature2_x id_y Feature1_y Feature2_y
0 1 A B 1 K L
1 2 C D 2 M N
2 3 E F 6 O P
3 4 G H 7 Q R
4 5 I J 8 S T

pandas Únete

La función DataFrame.join de Pandas se utiliza para unir marcos de datos en índices únicos. Puede utilizar el argumento opcional `on` para unir nombres de columna(s) en el índice y como argumentos manejar la operación de los dos objetos. Por defecto, utilizará la unión interna. 

pandas Une Dos Dataframes

Unamos dos marcos de datos utilizando .join. Hemos proporcionado `lsuffix` y `rsuffix` para evitar que se produzca el error de solapamiento de columnas. Se une basándose en el índice, no en la columna, así que tenemos que cambiar la columna 'id' o proporcionar un sufijo.

df2.join(df3, lsuffix='_left', rsuffix='_right')

  id_left Artículo1 Artículo2 id_right Feature3
0 1 K L 1 12
1 2 M N 2 13
2 6 O P 3 14
3 7 Q R 4 15
4 8 S T 5 16

También podemos unir columnas en el índice utilizando el argumento `on`. Para aplicar la unión con éxito, tenemos que df3 columna 'id' al índice y proporcionar el argumento `on` con la columna 'id'. Por defecto, utilizará la unión izquierda.   

df2.join(df3.set_index('id'), on='id')

  id Artículo1 Artículo2 Feature3
0 1 K L 12.0
1 2 M N 13.0
2 6 O P NaN
3 7 Q R 17.0
4 8 S T 15.0

Al igual que la función merge, podemos cambiar el funcionamiento de join proporcionando un argumento `how`. En nuestro caso, utilizaremos una unión interna. 

df2.join(df3.set_index('id'), on='id', how = "inner")

  id_left Artículo1 Artículo2 Feature3
0 1 K L 12
1 2 M N 13
3 7 Q R 17
4 8 S T 15

Fusión de series temporales

Pandas proporciona funciones especiales para fusionar DataFrames de series temporales. Quizá la más útil y popular sea la función merge_asof(). La función merge_asof() es similar a una unión ordenada a la izquierda, salvo que la coincidencia se realiza por la clave más cercana en lugar de por claves iguales. Para cada fila del DataFrame de la izquierda, se selecciona la última fila del DataFrame de la derecha cuya clave on sea menor que la clave de la izquierda. Ambos DataFrames deben estar ordenados por la clave.

Opcionalmente, una fusión asof puede realizar una fusión por grupos. Esto coincide igualmente con la tecla by, además de la coincidencia más cercana de la tecla on.

Por ejemplo, puede que tenga operaciones y cotizaciones y quiera fusionarlas. Aquí el DataFrame izquierdo se elige como operaciones y el DataFrame derecho como cotizaciones. A partir de ese momento, se fusionan en tiempo clave y se agrupan por su símbolo de cotización.

trades = pd.DataFrame({
    'time': pd.to_datetime(['20160525 13:30:00.023',
                            '20160525 13:30:00.038',
                            '20160525 13:30:00.048',
                            '20160525 13:30:00.048',
                            '20160525 13:30:00.048']),
    'ticker': ['MSFT', 'MSFT','GOOG', 'GOOG', 'AAPL'],
    'price': [51.95, 51.95,720.77, 720.92, 98.00],
    'quantity': [75, 155,100, 100, 100]},
    columns=['time', 'ticker', 'price', 'quantity'])

quotes = pd.DataFrame({
    'time': pd.to_datetime(['20160525 13:30:00.023',
                            '20160525 13:30:00.023',
                            '20160525 13:30:00.030',
                            '20160525 13:30:00.041',
                            '20160525 13:30:00.048',
                            '20160525 13:30:00.049',
                            '20160525 13:30:00.072',
                            '20160525 13:30:00.075']),
    'ticker': ['GOOG', 'MSFT', 'MSFT','MSFT', 'GOOG', 'AAPL', 'GOOG','MSFT'],
    'bid': [720.50, 51.95, 51.97, 51.99,720.50, 97.99, 720.50, 52.01],
    'ask': [720.93, 51.96, 51.98, 52.00,720.93, 98.01, 720.88, 52.03]},
    columns=['time', 'ticker', 'bid', 'ask'])
trades
  tiempo ticker precio cantidad
0 2016-05-25 13:30:00.023 MSFT 51.95 75
1 2016-05-25 13:30:00.038 MSFT 51.95 155
2 2016-05-25 13:30:00.048 GOOG 720.77 100
3 2016-05-25 13:30:00.048 GOOG 720.92 100
4 2016-05-25 13:30:00.048 AAPL 98.00 100
quotes
  tiempo ticker oferta pregunte a
0 2016-05-25 13:30:00.023 GOOG 720.50 720.93
1 2016-05-25 13:30:00.023 MSFT 51.95 51.96
2 2016-05-25 13:30:00.030 MSFT 51.97 51.98
3 2016-05-25 13:30:00.041 MSFT 51.99 52.00
4 2016-05-25 13:30:00.048 GOOG 720.50 720.93
5 2016-05-25 13:30:00.049 AAPL 97.99 98.01
6 2016-05-25 13:30:00.072 GOOG 720.50 720.88
7 2016-05-25 13:30:00.075 MSFT 52.01 52.03
df_merge_asof = pd.merge_asof(trades, quotes,
              on='time',
              by='ticker')

df_merge_asof
  tiempo ticker precio cantidad oferta pregunte a
0 2016-05-25 13:30:00.023 MSFT 51.95 75 51.95 51.96
1 2016-05-25 13:30:00.038 MSFT 51.95 155 51.97 51.98
2 2016-05-25 13:30:00.048 GOOG 720.77 100 720.50 720.93
3 2016-05-25 13:30:00.048 GOOG 720.92 100 720.50 720.93
4 2016-05-25 13:30:00.048 AAPL 98.00 100 NaN NaN

Si observa atentamente, podrá darse cuenta de la razón por la que aparece NaN en la fila del teletipo AAPL. Como las cotizaciones del DataFrame derecho no tenían ningún valor de hora inferior a 13:30:00.048 (la hora de la tabla izquierda) para el ticker AAPL, se introdujeron NaNs en las columnas bid y ask.

También puede establecer un nivel de tolerancia predefinido para la columna de tiempo. Supongamos que sólo desea una fusión asof dentro de los 2 ms entre la hora de cotización y la hora de negociación, entonces tendrá que especificar el argumento de tolerancia:

df_merge_asof_tolerance = pd.merge_asof(trades, quotes,
              on='time',
              by='ticker',
              tolerance=pd.Timedelta('2ms'))

df_merge_asof_tolerance
  tiempo ticker precio cantidad oferta pregunte a
0 2016-05-25 13:30:00.023 MSFT 51.95 75 51.95 51.96
1 2016-05-25 13:30:00.038 MSFT 51.95 155 NaN NaN
2 2016-05-25 13:30:00.048 GOOG 720.77 100 720.50 720.93
3 2016-05-25 13:30:00.048 GOOG 720.92 100 720.50 720.93
4 2016-05-25 13:30:00.048 AAPL 98.00 100 NaN NaN

Observa la diferencia entre el resultado anterior y el anterior. Las filas no se fusionan si la tolerancia de tiempo no coincide con 2ms.

Conclusión

En este tutorial, ha aprendido a concatenar y fusionar DataFrames basados en varias lógicas utilizando las funciones concat() y merge() de la librería pandas. Hacia el final, también practicó la función especial merge_asof() para fusionar DataFrames de series temporales. Por el camino, también aprendiste a jugar con los índices de los DataFrames. Hay varias otras opciones que puedes explorar para unir DataFrames en pandas, y te animo a que eches un vistazo a su fantástica documentación. ¡Feliz exploración!

Este tutorial utilizó esta documentación de pandas para ayudar a escribirlo.

Si quieres aprender más sobre pandas, sigue el curso de Fundamentos de pandas de DataCamp y echa un vistazo a nuestro Tutorial de Pandas sobre DataFrames en Python.

DataCamp también tiene otros tutoriales útiles sobre pandas, entre los que se incluyen:

¡Feliz aprendizaje!

Temas

Más información sobre Python y pandas

Course

Pandas Joins for Spreadsheet Users

4 hr
3.6K
Learn how to effectively and efficiently join datasets in tabular format using the Python Pandas library.
See DetailsRight Arrow
Start Course
Ver másRight Arrow
Relacionado

blog

20 preguntas principales de la entrevista sobre SQL Joins

Prepara tu entrevista SQL con esta lista de las preguntas más comunes sobre SQL Joins
Javier Canales Luna's photo

Javier Canales Luna

15 min

blog

Las 8 principales competencias de los analistas de negocio para 2024

Explore las principales competencias técnicas y sociales de los analistas de negocio necesarias para tener éxito y la mejor forma de mostrarlas en su cartera y en su currículum.
Joleen Bothma's photo

Joleen Bothma

11 min

blog

Las 10 principales conferencias sobre análisis de datos para 2024

Descubra las conferencias y eventos sobre analítica más populares programados para 2024.
Javier Canales Luna's photo

Javier Canales Luna

7 min

blog

Las 31 mejores preguntas y respuestas para entrevistas a analistas de negocio de todos los niveles

Explore las preguntas habituales en las entrevistas a analistas de negocio y sus respuestas para todos los niveles de experiencia.
Austin Chia's photo

Austin Chia

18 min

blog

5 formas únicas de utilizar la IA en el análisis de datos

El análisis de datos con IA está en auge entre los profesionales de los datos. Conozca en esta guía cinco formas únicas de aprovechar el poder de la IA para el análisis de datos.
Austin Chia's photo

Austin Chia

blog

Las 6 mejores certificaciones de analista de negocio: Su camino hacia la certificación

Explore las principales certificaciones de analista de negocio para mejorar su carrera. Infórmese sobre las ventajas, consejos de preparación y cómo puede ayudarle DataCamp.
Matt Crabtree's photo

Matt Crabtree

15 min

See MoreSee More