Adrianistán

El blog de Adrián Arroyo


Estadística en Python: manipulando datos en Pandas (Parte II)

- Adrián Arroyo Calle

Antes de pasar a otros temas vamos a mencionar como podemos manipular los DataFrame en Pandas. Imaginemos que tenemos una tabla con datos de estatura y peso. Podemos generar una nueva columna con el índice de masa corporal. Veamos como se puede hacer

Fichero de ejemplo


nombre,peso,altura
Basilio,67,1.5
Arturo,80,1.7
Cristina,50,1.4
Alfonso,100,2.0
Nerea,70,1.8

Seleccionado datos


A veces queremos quedarnos con parte de los datos que cumplen una condición. Hay varias maneras de hacerlo.

Ejemplo: Quédate con los datos de Nombre y Altura de los pacientes con peso igual o superior a 70
import pandas as pd

df = pd.read_csv("pesos.csv")

tab = df.loc[df["peso"] >= 70,["nombre","altura"]]

import pandas as pd

df = pd.read_csv("pesos.csv")

tab = df[df["peso"] >= 70][["nombre","altura"]]

import pandas as pd

df = pd.read_csv("pesos.csv")

tab = df.query("peso >= 70")[["nombre","altura"]]

Cualquiera de estos tres métodos pueden usarse indistintamente.


Apply


Apply es una función de DataFrame muy potente que permite aplicar una función a todos las columnas o a todas las filas.

Ejemplo: Calcule el IMC (Índice de Masa Corporal) con los valores de la tabla
import pandas as pd

df = pd.read_csv("pesos.csv")

def imc(x):
return x["peso"]/(x["altura"]**2)

df["imc"] = df.apply(imc,axis=1)
print(df)


Drop


¿Qué pasa si queremos borrar algún dato o columna?

Si queremos borrar columnas:
df.drop(["peso"],axis=1)

Si queremos borrar datos:
df.drop(ELEMENTOS,inplace=True)

# puede haber una condicion compleja
df.drop(df[df["altura"] < 1.6].index,axis=0,inplace=True)

Construyendo el DataFrame a mano


Normalmente los datos los leeremos de algún archivo o base de datos (read_csv, read_json, read_html, read_sql, read_hdf, read_msgpack, read_excel, read_pickle, read_gbq, read_parquet, ...) pero puede darse el caso de que necesitemos ingresar los datos manualmente. El constructor de DataFrame admite diccionarios, arrays de NumPy y arrays de tuplas.
import pandas as pd
import numpy as np

datos_dict = {"peso": [50,60], "altura": [1.6,1.7]}
df = pd.DataFrame(data=datos_dict)

datos_numpy = np.array([[50,1.6],[70,1.7]])
df = pd.DataFrame(data=datos_numpy,columns=("peso","altura"))

datos_tuple = [(50,1.6),(70,1.7)]
df = pd.DataFrame(data=datos_tuple,columns=("peso","altura"))

 

Concatenar DataFrames


Si tenemos varios DataFrames de características similares (columnas iguales) podemos unirlos. Hay que tener cuidado con los índices. Si el tema de los índices te da igual, usa ignore_index.
import pandas as pd

df = pd.read_csv("pesos.csv")

datos1 = [("Emilio",78,1.6),("Rosa",80,1.8)]
df1 = pd.DataFrame(data=datos1,columns=("nombre","peso","altura"))

datos2 = [("Agustín",75,1.6),("Ana",90,1.8)]
df2 = pd.DataFrame(data=datos2,columns=("nombre","peso","altura"))

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


Join DataFrames


Si vienes del mundo SQL quizá te suene el tema de los JOIN. En Pandas existe un potente sistema de join, similar al usado en las bases de datos SQL más importantes y con excelente rendimiento. Pandas soporta joins de tipo LEFT, RIGHT, OUTER e INNER.
import pandas as pd

df = pd.read_csv("pesos.csv")

otros_datos = [("Nerea",19),("Irena",21)]
tab_edad = pd.DataFrame(data=otros_datos,columns=("nombre","edad"))

tab_right = pd.merge(df,tab_edad,on="nombre",how="right")
tab_left = pd.merge(df,tab_edad,on="nombre",how="left")
tab_inner = pd.merge(df,tab_edad,on="nombre",how="inner")
tab_outer = pd.merge(df,tab_edad,on="nombre",how="outer")

Con esto ya sabemos lo básico para manejarnos con DataFrames de Pandas

 

Añadir comentario

Todos los comentarios están sujetos a moderación