🐼 Pandas
Resumen de Pandas
- Una tabla es un dataframe en Pandas.
- Una columna es una serie en Pandas.
- Leer y guardar dataframes:
- Leer desde CSV:
df = pd.read_csv("filepath o url")
- Leer desde CSV:
Información sobre el dataframe:
- Primeras 10 filas:
df.head(10) - Últimas 7 filas:
df.tail(7) - 13 filas aleatorias:
df.sample(13) - Número de filas y variables:
df.shape - Nombres de las variables:
df.columns - Tipos de datos de las variables:
df.info() - Estadísticas de las variables numéricas:
df.describe() - Estadísticas de las variables categóricas:
df.describe(include=['object', 'bool'])
Selección
- Seleccionar una variable (columna):
df["miVariable"]odf.miVariable - Seleccionar varias variables:
df[["miVariable", "otraVariable", "terceraVar"]] - Seleccionar una celda por variable y fila:
df["miVariable"][0] - Recuerda que una condición nos devuelve para cada fila
TrueoFalse:- Condición de igualdad:
df.pais == "España" - Condición de mayor que:
df.edad > 18 - Condición de está en:
df.pais.isin(["España", "Italia"]) - Condición de missing:
df.price.isnull()(el contrario es.notnull())
- Condición de igualdad:
- Seleccionar ciertas filas (1 filtro):
df[ df.pais=="España" ] - Seleccionar ciertas filas (N filtros):
df[ (df.pais == "España") & (df.edad > 18")](¶ AND,|para OR)
Añadir y modificar
- Nueva variable con valor constante:
df['var'] = 'valor constante' - Nueva variable con un rango:
df['index'] = range(len(df)) - Modificar una celda:
df.at[4, 'B'] = 10
Distinguir vars numérica/categorias/fechas/texto
- Mediante
select_dtypes- Lista de las vars categórias:
cat_vars = list(df.select_dtypes(include=["category", "object", "bool"]).columns) - Lista de las vars numéricas:
num_vars = list(df.select_dtypes(exclude=["category", "object", "bool", "datetime64"]).columns) - Lista de las vars fecha y hora:
time_vars = list(df.select_dtypes(include=['datetime64']).columns)
- Lista de las vars categórias:
- Mediante
dtypes- Lista de las vars categórias:
cat_vars = df.dtypes[df.dtypes == "object"].index - Lista de las vars numéricas:
num_vars = df.dtypes[df.dtypes != "object"].index
- Lista de las vars categórias:
Variables numéricas
- Agregaciones escalares
- Mínimo:
df.num_var.min() - Máximo:
df.num_var.max() - Media:
df.num_var.mean() - Mediana:
df.num_var.median() - Desviación estándar:
df.variable.std() - Varianza:
df.num_var.var() - Error estándar de la media:
df.num_var.sem() - Skewness:
df.num_var.skew() - Kurtosis:
df.num_var.kurt() - Primero:
df.num_var.first() - Último:
df.num_var.last() - Enesimo:
df.num_var.nth(NUMERO)
- Mínimo:
- Cuartiles:
df.num_var.describe() - Recuento:
df.num_var.count()odf.num_var.size() - Ranking:
df.num_var.rank()
Variables categórias
- Categorías (recuento):
df.cat_var.value_counts()- Categorías (porcentaje):
df.cat_var.value_counts(normalize=True)
- Categorías (porcentaje):
- Categorías (cuantas hay para cada var)
df.nunique()- Plot
df.nunique().sort_values().plot.barh() - Categorías (cuantas hay respecto al maximo)
df.nunique()/len(df) - Categorías (cuantas hay de una var)
df.cat_var.nunique()
- Plot
- Categorías (solo nombres)
df.cat_var.unique() - Cruzar 2 variables categóricas:
pd.crosstab(df.cat_var1, df.cat_var2)- Con márgenes
pd.crosstab(df.cat_var1, df.cat_var2, margins=True) - En porcentajes totales
pd.crosstab(df.cat_var1, df.cat_var2, normalize=True) - En porcentajes por fila
pd.crosstab(df.cat_var1, df.cat_var2, normalize="index") - En porcentajes por columna
pd.crosstab(df.cat_var1, df.cat_var2, normalize="columns")
- Con márgenes
Variables numéricas + categóricas = agregaciones
- Group by:
df.groupby([cat_var1, cat_var2,...])[[num_var1, num_var2,...]].agg(["min", "max", "mean", "std", "first"]) - Pivot table:
df.pivot_table([num_var1, num_var2, ...], [cat_var1, cat_var2], aggfunc='mean')
Aplicar estilo
- Colorear celdas según su valor (heatmap):
df.style.background_gradient() - Pintar barras:
df.style.bar(subset=['Var1', 'Var2'], color='#d65f5f')
Big Data
Cuando los datos son muy grandes y tardan mucho en ser procesados o directamente no caben en memoria (más gigas en el CSV que en la memoria RAM) estas son las recomendaciones a seguir:
- Una manera de aligerar los cálculos es disminuir el tamaño que ocupa nuestro dataframe. Convirtiendo enteros y floats de 32 y 64 bits a 8 y 16 bits, podemos reducir mucho el tamaño.
.astype('int32'),.astype('flaot32') - Si guardas los datos en formato binario (como
.npy) serán más rápidos de leer que en texto planto (como.csv). - Más consejos en Enhancing performance y Scaling to large datasets.
- H20 dispone de un paquete llamado datatable que es un poco más eficiente que pandas.
Material adicional