Table of Contents
Introducción
Comenzamos con el tercer post de nuestra saga de formación en ciencia de datos con Pandas. En este artículo vamos a hacer un resumen de las diferentes funciones que se utilizan en Pandas para realizar Iteración, Mapas, Agrupación y Ordenación. Estas funciones nos permiten realizar transformaciones de los datos dándonos información y conocimientos útiles.
Iteración, mapas, agrupación y clasificación
El conjunto de datos de 2009 ‘Wine Quality Dataset‘ realizado por Cortez et al. disponible en UCI Machine Learning , es un conocido conjunto de datos que contiene información sobre la calidad del vino. Incluye datos sobre las propiedades fisicoquímicas del vino tinto y blanco y una puntuación de calidad.
Antes de empezar, vamos a visualizar una cabeza de nuestro conjunto de datos didácticos que vamos a seguir para mostrar los ejemplos utilizando la función pandas head.
Iteración
Comenzamos con las funciones relacionadas con la iteración a través de un conjunto de datos. Es posible que queramos utilizar esta función cuando queramos iterar fila por fila.
El comportamiento de la iteración básica sobre objetos Pandas depende del tipo. Cuando se itera sobre una Serie, se considera como un array, y la iteración básica produce los valores. Otras estructuras de datos, como DataFrame y Panel, siguen la convención de iterar sobre las claves de los objetos.
Si iteramos sobre un DataFrame, obtenemos los nombres de las columnas.
for element in df:
print(element)
fixed acidity
volatile acidity
citric acid
residual sugar
chlorides
free sulfur dioxide
total sulfur dioxide
density
pH
sulphates
alcohol
quality
Para iterar sobre las filas del DataFrame, podemos utilizar las siguientes funciones:
Item
En consonancia con la interfaz tipo dictado, items() e iteritems() iteran a través de pares clave-valor:
+ Series: (índice, valor escalar) pares
+ DataFrame: (columna, Serie) pares
for key, value in wines.items():
print(key)
print(value)
fixed acidity
0 7.4
1 7.8
2 7.8
3 11.2
4 7.4
...
1594 6.2
1595 5.9
1596 6.3
1597 5.9
1598 6.0
Name: fixed acidity, Length: 1599, dtype: float64
volatile acidity
0 0.700
1 0.880
2 0.760
3 0.280
4 0.700
...
Iterrows
Permite iterar a través de las filas de un DataFrame como objetos Series. Devuelve un iterador que produce cada valor de índice junto con una Serie que contiene los datos de cada fila:
for row_index, row in wines.iterrows():
print(row_index, row, sep="\n")
0
fixed acidity 7.4000
volatile acidity 0.7000
citric acid 0.0000
residual sugar 1.9000
chlorides 0.0760
free sulfur dioxide 11.0000
total sulfur dioxide 34.0000
density 0.9978
pH 3.5100
sulphates 0.5600
alcohol 9.4000
quality 5.0000
Name: 0, dtype: float64
1
fixed acidity 7.8000
volatile acidity 0.8800
citric acid 0.0000
residual sugar 2.6000
chlorides 0.0980
free sulfur dioxide 25.0000
total sulfur dioxide 67.0000
density 0.9968
pH 3.2000
sulphates 0.6800
alcohol 9.8000
quality 5.0000
Name: 1, dtype: float64
2
fixed acidity 7.800
volatile acidity 0.760
citric acid 0.040
residual sugar 2.300
...
Itertuples
El método itertuples() devolverá un iterador con una tupla con nombre para cada fila del DataFrame. El primer elemento de la tupla será el valor de índice correspondiente a la fila, mientras que los valores restantes son los valores de la fila.
for row in wines.itertuples():
print(row)
Pandas(Index=0, _1=7.4, _2=0.7, _3=0.0, _4=1.9, chlorides=0.076, _6=11.0, _7=34.0, density=0.9978, pH=3.51, sulphates=0.56, alcohol=9.4, quality=5)
Pandas(Index=1, _1=7.8, _2=0.88, _3=0.0, _4=2.6, chlorides=0.098, _6=25.0, _7=67.0, density=0.9968, pH=3.2, sulphates=0.68, alcohol=9.8, quality=5)
...
Conclusión
La biblioteca Pandas nos ha proporcionado 3 funciones diferentes que facilitan relativamente la iteración sobre los conjuntos de datos dados. Son:
iteritems(): Esta función de la librería Pandas ayuda al usuario a iterar sobre todos y cada uno de los elementos presentes en el conjunto, por columnas. Esta función será útil en el caso de que queramos buscar algo fila por fila pero columna por columna. De esta manera no hay que iterar sobre todas las columnas.
iterrows(): Esta función de la librería Pandas ayuda al usuario a iterar sobre todos y cada uno de los elementos presentes en el conjunto, fila a fila. Esta función será útil en caso de que queramos iterar fila por fila para poder buscar un valor de fila específico sin iterar todo el conjunto de datos.
itertuple(): Esta función de la librería Pandas ayuda al usuario a iterar sobre cada fila presente en el conjunto de datos mientras se forma una tupla con los datos dados. Esta función será útil cuando necesitemos iterar fila por fila pero la salida tiene que tener formato de tupla.
Mapas
Continuamos con las dos funciones más importantes para mapear una Serie o Conjunto de Datos.
Mapa
La función Pandas map() se utiliza para mapear cada valor de un objeto Serie a otro valor utilizando un diccionario/función/Serie.Es una función de conveniencia para mapear valores de una Serie de un dominio a otro dominio, ya que nos permite realizar una operación de transformación de todas las filas de una columna determinada en un conjunto de datos.
Por ejemplo, podemos transformar la serie obtenida de la columna `densidad` ejecutando una función que multiplique cada uno de sus valores por 100.
data['density'].map(lambda x: x * 100)
0 99.780
1 99.680
2 99.700
3 99.800
4 99.780
...
1594 99.490
1595 99.512
1596 99.574
1597 99.547
1598 99.549
Name: density, Length: 1599, dtype: float64...
Aplica
Se pueden aplicar funciones arbitrarias a lo largo de los ejes de un DataFrame utilizando el método aplicar(), que, al igual que los métodos de estadística descriptiva, toma un argumento de eje opcional:
Por ejemplo, podemos restaurar los valores de la columna `densidad` ejecutando una función que divida cada uno de sus valores por 100, sin tener que extraer las Series del Dataframe ya que la función maps trabaja con Dataframes.
def divide_by_100(x):
x.density = x.density / 100
return x
data.apply(divide_by_100, axis='columns')
Agrupación
La definición abstracta de agrupación es proporcionar un mapeo de etiquetas a nombres de grupos. Para crear un objeto GroupBy agrupando por `calidad` se puede hacer lo siguiente:
wines.groupby(["quality"]).quality.count()
quality
3 10
4 53
5 681
6 638
7 199
8 18
Name: quality, dtype: int64
También puedes crear el objeto GroupBy y aplicar una función personalizada, por ejemplo en este caso vamos a agrupar por `calidad` y `alcohol` y obtener la mayor densidad de cada uno:
wines.groupby(['quality', 'alcohol']).apply(lambda df: df.loc[df.density.idxmax()])
Por último, dentro del apartado de agrupación, una de las funciones más útiles en el análisis de datos es la función de agregación.
En este caso vamos a agrupar por `calidad` y vamos a obtener el valor máximo y mínimo de `alcohol` para cada grupo.
wines.groupby(['quality']).alcohol.agg([min, max])
Clasificación
En este caso vamos a utilizar un conjunto de datos diferente para explicar claramente toda la funcionalidad de ordenación dentro de Pandas. Para ello vamos a observar primero el pequeño conjunto de datos de ejemplo que vamos a manipular al que llamaremos `unsorted_df`:
+ Ordenar por índice
unsorted_df.sort_index()
+ Ordenar por índice de forma descendente
unsorted_df.sort_index(ascending=False)
+ Ordenar por columnas
unsorted_df.sort_index(axis=1)
+ Ordenar por valores
unsorted_df.sort_values(by="two")
Entrenando tus habilidades
Si quieres incrementar tus habilidades aún más en Ciencia de Datos, hemos creado un curso que puedes descargar gratuitamente aquí.
En el próximo capítulo, profundizaremos en las funciones que utilizamos para el tratamiento de los datos que faltan.