Skip to content

2024 S2 D. Pandas

Published: at 09:10 AM

Unir bases: concatenar series

Concatenar

Si AA y BB son objetos organizados, concatenar AA y BB consiste en crear un nuevo objeto CC con los registros de AA y BB; organizados secuencialmente.

Ejemplo

Dados:

 ser1 = pd.Series(['A', 'B', 'C'], index=[1, 2, 3])
 
 ser2 = pd.Series(['D', 'E', 'F'], index=[4, 5, 6])
 

¿Qué tipo de estructura de datos son? ¿Cómo espera que se muestren en Python ?

Concatenar las Series

pd.concat([ser1,ser2])

Si las series son las siguientes:

Impresión de pantalla. La serie 1 es un conjunto de datos en columna, con los valores A,B,C

Se pueden concatenar de la siguiente manera:

Impresión de pantalla. La serie 2 es un conjunto de datos en columna, con los valores D,E,F

DataFrames con las mismas variables

Concatenar dos DataFrames. Los definimos (usualmente usted los lee de un archivo):

df1=pd.DataFrame([['A1','B1'],['A2','B2']],columns=['A','B'],index=[1,2])
df2=pd.DataFrame([['A3','B3'],['A4','B4']],columns=['A','B'],index=[3,4])

Los concatenamos con el comando pd.concat:

Impresión de pantalla. El comando es dfc=pd.concat([df1,df2]). El resultado es una tabla con las columnas A y B, y su primer registro es A1,B1

Usualmente no nos interesa preservar el índice, luego usamos la opción ignore_index=True, para que se reasigne el índice:

Impresión de pantalla. Primero está la instrucción pd.concat([df1,df2],ignore_index=True), seguido por una tabla con las variables A, B, y cuyo primer registro es A1,B1.

DataFrames con diferentes variables

Concatenar dos DataFrames

Los definimos (usualmente usted los lee de un archivo):

df5=pd.DataFrame([['A1','B1','C1'],['A2','B2','C2']],columns=['A','B','C'],index=[1,2])
df6=pd.DataFrame([['B3','C3','D3'],['B4','C4','D4']],columns=['B','C','D'],index=[3,4])

Imprímalos. ¿Qué variables tiene df5?

¿Qué variables tiene df6?

Podemos usar el atributo .columns, así: `df5.columns’.

¿Que cree que puede pasar al concatenar los dos DataFrames?

Concatenar Uniendo los conjuntos de variables

El DataFrame, mezcla de df5 y df6, tiene todas las variables (aquí AA,BB,CC,DD.):

pd.concat([df5,df6],join='outer')

‘outer’ es el valor por defecto de join, es equivalente a

pd.concat([df5,df6])

Se obtiene lo siguiente:

Impresión de pantalla. Primero está la instrucción pd.concat([df5,df6]), cuyo resultado es una tabla con las variables A,B,C,D. El primer registro es A1,B1,C1,NaN. La segunda instrución es pd.concat([df5,df6],join='outer'), el resultado es una tabla con las variables A,B,C,D. El primer registro se sde nuevo A1,B1,C1,NaN

Intersectando conjuntos de variables

El DataFrame, mezcla de df5 y df6, tiene sólo las que están en ambos \pause (en este caso, BB y CC.):

Impresión de pantalla de código. Está la instrucción pd.concat([df5,df6],join='inner') y luego el resultado de esa instrucción, que es una tabla con las variables "b" y "C".

Combinar DataFrames: Merge y Join

Merge: Uno a Uno

Supongamos que se tienen los siguientes conjuntos de datos (organizados en dataframes):

Tabla con las variables "employee", "group". El primer registro es "bob", "accounting"

Tabla con las variables "employee", "hiredate". El primer registro es "Lisa", 2004

un(valor de la variable)-a-un(valor de la variable)

Un merge uno a uno consiste en crear un nuevo conjunto de datos (dataframe, tabla) que tenga los valores del primero apareados con los valores de la segunda.

¿Cuáles son las variables de df7?

¿Cuáles son las variables de df8?

Si queremos un DataFrame que tenga las variables 'employee','hiredate','group', debemos mezclar, aparear, df7 y df8.

merge

El comando mergede Python aparea automáticamente si hay una variable compartida en los dos DataFrames. El código sería el siguiente. Primero generamos el conjunto de datos df7 y el conjunto de datos df8:

df7 = pd.DataFrame({'employee': ['Bob', 'Jake', 'Lisa', 'Sue'],'group': ['Accounting', 'Engineering', 'Engineering', 'HR']})
df8=pd.DataFrame({'employee': ['Lisa','Bob','Jake','Sue'],'hiredate': [2004,2008,2012,2014]})

Y luego hacemos el merge:

dfm = pd.merge(df7,df8)
print(dfm)

El resultado es el siguiente:

Tabla con las variables "employee", "group", "hiredate". El primer registro es "Bob", "accounting", "hiredate"

Tenga en cuenta que:

Merge: Muchos (valores de la variable) a Un (valor de la variable)

Vamos a trabajar con el conjunto dfmque habíamos generado anteriormente, y un nuevo conjunto df9:

Tabla con las columnas "group", "supervisor". El primer registro tiene los valores "Accounting" y "Carly".

¿cuál sería el código para asignar los datos de esa tabla a la variable df9?

Muchos-a-Uno

Se trata de unir dos DataFrames, en el caso en que uno de ellos tiene registros que repiten el mismo valor de la variable.

En éste caso, ¿Qué variable de dfm tiene valores repetidos en diferentes registros?

merge

Al mezclar dfm y df9 Python crea un nuevo conjunto de datos, para el cual a cada registro se le asigna la variable supervisor, apareando de las dos tablas anteriores. Hagamos el merge, asignémoslo a la variable df9, e imprimamos el resultado de la operación.

dfm3 = pd.merge(dfm,df9)
print(dfm3)

El resultado es el siguiente

Tabla con las columnas "employee", "group", "hiredate", "supervisor"

Merge: Muchos a Muchos

Supongamos que tenemos los siguientes conjuntos de datos.

Primero df7 es:

Tabla con las columnas "employee", "group". El primer registro tiene los valores "Bob" y "accounting"

Y df10 es:

Tabla con las columnas "group", "skills". El primer registro tiene los valores "accounting" y "math"

Éscriba el código para generar estas dos tablas.

¿Qué variable comparten los DataFrames?

¿Que espera que pase al mezclarlos?

Muchos-a-Muchos

Se trata de un apareamiento muchos-a-muchos porque en ambos dataframes hay variables que tienen registros repetidos.

merge

El código para mezclarlos es:

dfm2 = pd.merge(df7,df10)

Y se puede imprimir el resultado con:

print(dfm2)

En este caso el resultado es:

Tabla con las columnas "employee", "group", "skills". El primer registro tiene valores "Bob", "Accounting", "math". El segundo registro tiene valores "bob", "accounting", "spreadsheets"

Por cada valor de skills hay un registro, así se repitan los valores de las varriables employee y group.

Ejercicio

Pregunta

Tenemos dos archivos con información de la interacción de personas con el Estado. Queremos determinar si las personas pueden participar en un concurso. En la primera base df1 tenemos número de cédula y tipo de trámite que quiere realizar. En la segunda base, df2, tenemos número de cédula y una variable que indica si la persona tiene o no sanción disciplinaria.

¿Qué operación/operaciones haría para generar una base que indique si las personas que quieren participar en el concurso tienen o no sanción disciplinaria?

Casos Especiales

Renombrar Variables

Si queremos renombrar las variables de un DataFrame, podemos usar el método .rename()

Por ejemplo, si tenemos el siguiente DataFrame, llamado df12:

Tabla, con las columnas A y B. El primer registro tiene valores 1, 4. El segundo 2 y 5. El tercer 3 y 6

Podemos querer cambiar el nombre de las variables (mayúscula a minúscula). Se puede hacer así:

df12.rename(columns={"A": "a", "B": "b"})

¡Atención! Por defecto la función devuelve un nuevo DataFrame. Para alterar el que tenemos, use la opción inplace.

df12.rename(columns={"A": "a", "B": "b"}, inplace=True)

Es decir:

Impresión de pantalla. Primero está la instrucción para generar df12: df12=pd.DataFrame({"A":[1,2,3],"B":[4,5,6]}). Luego está la instrucción para renombrar, df12.rename(columns={"A": "a", "B": "b"}).

Especificar la columna a usar de clave para mezclar

Si los DataFrames comparten diversas variables, podemos usar la opción on para especificar cuál variable usar como clave para mezclar.

EJEMPLO

Si el df13 es el siguiente:

Tabla, con las variables "employee", "group", "lastname". Los registros repiten algunos valores, por ejemplo "Engineering" se repite dos veces, "accounting" se repite dos veces, para la variable "group".

Y df14 el siguiente:

Tabla, con las variables "employee", "hiredate", "lastname". Los registros no se repiten.

¿qué variables son comunes entre los dos DataFrames?

Si hacemos el merge debemos especificar cuál de las variables se usa para mezclar. Por ejemplo puede ser employee. La instrucción:

pd.merge(df13,df14,on='employee')

El resultado es una nueva base, que usa como llaves la columna employee y tiene las variables de los dos conjuntos de datos anteriores. Como tenemos dos veces la variable lastnamem, una por conjunto, aquí nos saldrá repetida, es decir lastname_x es la del primer conjunto y lastname_y la del segundo.

Tabla, variables "employee", "group", "lastname_x", "hiredate", "lastname_y"

De nuevo, se puede remover la variable duplicada con el método .drop:

df15 = pd.merge(df13,df15, on="employee")
df15 = df15.drop("lastname_y", axis=1)
print(df15)

Produce la siguiente tabla:

Tabla, variables "employee", "group", "lastname_x", "hiredate"

Especificar columnas diferentes en DataFrames

Podemos especificar diferentes variables para cada DataFrame. Aquí el primero será left_on y el seguido será right_on.

Supongamos que tenemos el df11:

tabla con las variables "name" y "salary"

Una forma de ingresar este DataFrame es el siguiente código:

df11=pd.DataFrame({'name': ['Bob', 'Jake', 'Lisa', 'Sue'],'salary': [70000, 80000, 120000, 90000]})

El df7 es el que ya teníamos:

Tabla con las columnas "employee", "group". El primer registro tiene los valores "Bob" y "accounting"

Los DataFrames df11 y df7 tienen variables con la misma información pero diferente nombre de variable. Podemos mezclar, pero debemos especificar cuáles son las variables. La instrucción es:

pd.merge(df7,df11,left_on="employee",right_on="name").drop("name",axis=1)

Se obtiene la siguiente tabla:

Tabla con las variables "employee", "group", "name" y "salary"

Inner - Outer - Left - Right

Volvamos a pensar en que pasa cuando existen valores de los registros que no se encuentran en ambos DataFrames.

Tomemos los siguientes conjuntos de datos, llamados df13:

Tabla con las variables "employee", "group", "lastname". Los valores
de la variable "employee" son "Bob", "Jake", "Lisa", "sue" y
"vi"

y df16:

Tabla con las variables "employee", "código". Los valores
de la variable "employee" son "Estrella", "Esteban", "Lisa", "sue" y
"vi"

¿Qué cree que pasa si mezclamos estos dos dataframes?

inner

Intersecta los conjuntos, es decir, produce un DataFrame que tiene sólo registros que tienen valores de variables en ambos DataFrames:

pd.merge(df13,df16,how="inner")

Devuelve un DataFrame que sólo tiene los valores para los cuales la llave está en ambos.

Tabla con cuatro variables "employee", "group", "lastname" y "código", tiene tres registros, que corresponden a valores de "employee" en "Lisa", "Sue", y "Vi"

outer

Une los conjuntos, es decir, produce un DataFrame que tiene todos registros que tienen valores de variables en alguno de los DataFrames. Los valores faltantes los llena con NAs. En este ejemplo la instrucción sería:

pd.merge(df13,df16,how='outer')

Y se obtiene:

Tabla con cuatro variables "employee", "group", "lastname" y "código", tiene siete registros, que corresponden a valores de "employee" en "Bob", "jake", "Lisa", "Sue", "Vi", "Estrella" y "Estéban"

Merge a la izquierda (primer DataFrame) y a la derecha (segundo)

left

Si hay dos conjuntos de llaves, y difieren en algunos valores de la variable, se puede usar los registros que corresponden a los valores de la variable del primer DataFrame.

En el ejemplo que hemos trabajado, la instrucción sería:

pd.merge(df13,df16,how='left')

Y produciría el siguiente conjunto de datos:

Tabla con cuatro variables "employee", "group", "lastname" y "código", tiene cuatro registros, que corresponden a valores de "employee" en "Bob", "jake", "Lisa", "Sue" y "Vi"

Si hay dos conjuntos de llaves, y difieren en algunos valores de la variable, se puede usar los registros que corresponden a los valores de la variable del segundo DataFrame.

pd.merge(df13,df16,how="right")

Y produciría el siguiente conjunto de datos:

Tabla con cuatro variables "employee", "group", "lastname" y "código", tiene cuatro registros, que corresponden a valores de "employee" en "Estrella", "Estéban", "Lisa", "Sue" y "Vi"

Ejercicio

Mezclar las bases de datos del DANE de Nacimientos

Vamos a trabajar con la base que ya habíamos bajado anteriormente (Nacimientos para el año 1998), además de una nueva.


Previous Post
2024 S2 D2. Encuesta Calidad de Vida DANE
Next Post
Prueba de Hipótesis