Muy buenas, me llamo Luis y para hoy les traigo este nuevo tutorial.
Índice
Compartiendo más consejos de Pandas para subir de nivel la manipulación de datos
Este blog funcionará con una tabla de productos lácteos extraída directamente de la página wiki. Tabla de nutrientes alimentarios, usando el truco html. Aquí hay una instantánea de la tabla, donde muestra los nombres de los alimentos, medidas / gramos y los valores caloríficos correspondientes.
1. Pandas series
o list
o series of lists
En pocas palabras, la serie en Pandas es una matriz unidimensional con etiquetas de índice. A diferencia de un índice de lista diseñado para indicar la posición de un elemento, la etiqueta de índice en serie puede ser cualquier cosa definida por los usuarios. Esto ciertamente ofrece flexibilidad cuando se utilizan series, pero también “tiende una trampa” si no está familiarizado con el funcionamiento de las etiquetas de índice en pandas.
Entonces, nuestra tarea n. ° 1 de hoy es verificar si un valor (por ejemplo, skim, instant
) existe en una serie (p. ej., dairy_table[‘Food’]
). Si es así, devuelve verdadero; de lo contrario, falso. Fácil, y esta tarea requiere solo una línea de código, como se muestra a continuación junto con el resultado.
¿Sorprendido y confundido? Con lo mas intuitivo in
operador, nuestro primer código devuelve Falso, sin embargo, el segundo código devuelve Cierto? ¿Por qué Python me dice que el Comida la columna NO contiene skim, instant
, pero contiene index6
?
Bueno, la razón es que usar in
para comprobar contra una serie de Pandas directamente comprobará si o no skim, instant
existe en el ÍNDICE etiquetas, en lugar de las VALORES de nuestra columna de Alimentos. Por tanto, para no caer en esta “trampa”, debemos especificar el VALORES / lista de VALORES como nuestro espacio de búsqueda, y lo siguiente demuestra varias formas de cómo.
Pasando a la siguiente «trampa» potencial cuando se trabaja con series en Pandas, es decir, se permite que una sola serie contenga listas / tuplas, y se necesitan pasos adicionales para analizarlas en sus propias columnas. Por ejemplo, modifiquemos nuestra tabla láctea a un marco de datos con tuplas de valores como una nueva columna Nums.
Ahora, nuestra tarea n. ° 2 es separar los Números columna en dos columnas individuales. Nuevamente, la forma más intuitiva sería acceder a cada elemento dentro de las tuplas indexando.
Claro, esto funciona para nuestro ejemplo con solo dos valores en cada tupla. ¿Qué pasa si tenemos cientos de valores donde es imposible acceder a cada elemento manualmente? Además, como podemos ver en la salida, esta lista de comprensión devuelve una lista de cadenas que deben convertirse en valores enteros. ¡Bastantes detalles esenciales!
Entonces, ¿hay una manera obvia de lograrlo? La respuesta es sí y es bastante simple, como se muestra a continuación.
2. Agrupar valores de forma inteligente con map
o applymap
Nuestra tarea n. ° 3 es agrupar los valores de los alimentos en tres contenedores: leche, pudín y crema, definidos de la siguiente manera:
En lugar de crear tediosamente múltiples if
declaraciones o isin()
funciones, hagámoslo de una manera mucho más inteligente aprovechando el truco de mapeo. Primero, organizamos los valores en un diccionario de mapeo, donde cada valor pertenece a su contenedor correspondiente.
Entonces, usamos map
o applymap
para que se reemplacen los valores brutos,
Dos notas aquí:
(1) intercambiamos las claves y los valores en el diccionario de mapeo original, para que sus claves coincidan con los nombres reales de los alimentos en el conjunto de datos.
(2) demostramos dos formas de implementación: map
y applymap
, cuyos conceptos me preguntan a menudo sobre sus diferencias. En una palabra, map
acepta y devuelve SERIE, mientras que applymap
acepta y devuelve MARCO DE DATOS. Por ejemplo, el map()
La función en el código anterior se usa en la serie Alimentos, y recodificó los valores que no están en el diccionario como ‘otros’ con el método de la serie fillna()
.
Por el contrario, la segunda función applymap()
se utiliza en todo el marco de datos, buscando los valores que coinciden con las claves del diccionario (es decir, nombres de alimentos) y luego reemplazándolos con los valores correspondientes del diccionario (es decir, nombres de contenedores). Si no se encuentra una clave coincidente, el código dejará los valores sin procesar como están.
Por lo tanto, map()
o applymap()
funcionaría, y el código de una sola línea anterior es conciso de escribir y fácil de mantener, sin mencionar que debería ser significativamente más rápido que recorrer grupos para cada nombre de alimento.
3. where
utilizado como equivalente a ifelse
en R
Una de mis funciones favoritas en R es ifelse
; Del mismo modo, Pandas ofrece la where
función para hacer lo mismo: reemplazar valores cuando no se cumple la condición booleana especificada.
Por ejemplo, a continuación se muestra una lista de nombres de alimentos, y nuestro objetivo es sustituir los que se omiten en esta lista con ‘Otros’. Ahora veamos como where(other)
resulta útil para esta tarea de manipulación de datos.
4. Tipo de category
para ahorrar memoria
Por último, pero no menos importante, me gustaría discutir un truco con respecto a la Categórico tipo de datos en Pandas, una opción alternativa para ahorrar espacio Objeto datos. Cadenas guardadas como object-dtype
usualmente ocupa una cantidad significativa en el uso de memoria, mientras que category-dtype
utiliza valores enteros en el back-end para representar los valores brutos y, por lo tanto, es más eficiente en el espacio y el tiempo. Ahora, echemos un vistazo más de cerca al tipo de objeto Food_Category columna que acabamos de crear.
Un par de notas aquí, (1) una vez convertido al tipo de categoría, el Food_Category está codificado como números enteros debajo del capó; (2) el uso de memoria se reduce de 1051 bytes a 427 bytes (es decir, Reducción del 60%) al convertir el tipo de datos de objeto en tipo de datos de categoría.
Sin embargo, no se pueden pasar por alto dos advertencias con respecto al tipo de categoría d. Primero, como factors
en R, category-dtype
no es tan flexible como object-dtype
cuando se trata de asignación de nuevos valores. Por ejemplo, si queremos agregar una nueva categoría / nivel al Food_Category columna con el código a continuación, obtendríamos el infame mensaje ValueError. Este error indica que el nuevo nivel (es decir, Another_Category) debe agregarse primero al contenedor antes de ser asignado a cualquier fila.
Por lo tanto, la forma correcta es establecer el valor de nivel primero utilizando el método add_categories().
Otra advertencia sobre el category-dtype
es que para las columnas con menos valores repetidos, de los cuales el caso extremo serían todos los valores únicos, el category-dtype
ocupará más memoria que la object-dtype
. Tomemos el Comida columna como ejemplo, donde todos los valores son únicos.
Como podemos ver, memory_usage aumentó de 1605 bytes a 2262 bytes (es decir, 41% de aumento) una vez que Comida columna que se convierte en category-dtype
. Por lo tanto, un categórico sería más beneficioso para un almacenamiento eficiente cuando un object-dtype
La columna contiene muchos valores repetidos.
Ve y practica
En resumen, he compartido mis consejos y trucos de Pandas que desearía saber antes. El código completo está vinculado en mi Github. ¡Ahora es tu turno de empezar a codificar! 😃
No hay excelencia en la música [Pandas] debe adquirirse sin una práctica constante.– Lady Catherine en Jan Austen: Orgullo y prejuicio (Capítulo 31)
Espero que hayas disfrutado de este blog.
Añadir comentario