Seleción usando «query»
Pandas provee una alternativa para la selección condicional de registros a través de la función query(). Admite una sintaxis de consulta mediante operadores de comparación.
Veamos las mismas consultas de ejemplo que para el apartado anterior:
Truco: Si los nombres de columna contienen espacios, se puede hacer referencias a ellas con comillas invertidas. Por ejemplo: ‘Total Stock’.Python
Comparativa en consultas
Hemos visto dos métodos para realizar consultas (o filtrado) en un DataFrame: usando selección booleana con corchetes y usando la función query. ¿Ambos métodos son igual de eficientes en términos de rendimiento?
Haremos una comparativa muy simple para tener, al menos, una idea de sus órdenes de magnitud. En primer lugar creamos un DataFrame con 3 columnas y 1 millón de valores aleatorios enteros en cada una de ellas:
Ahora realizaremos la misma consulta sobre el DataFrame aplicando los métodos ya vistos:
Sin que esto sea en modo alguna concluyente, da la sensación de que query() anade un cierto «overhead» al filtrado y aumentan los tiempos de cómputo.
Modificación de un DataFrame
Modificando valores existentes
Partiendo del acceso a los datos que ya hemos visto, podemos asignar valores sin mayor dificultad.Python
Pero antes de modificar el DataFrame original, vamos a hacer una copia del mismo:Python
Supongamos que hemos cometido un error en el número de empleados/as de Apple y queremos corregirlo:
Supongamos que no se había contemplado una subida del 20% en los ingresos y queremos reflejarla:
Supongamos que todas las empresas tecnológicas mueven su sede a Vigo (España) y queremos reflejarlo:
Reemplazo de valores
Hay una función muy importante en lo relativo a la modificación de valores. Se trata de replace() y admite una amplia variedad de parámetros. Se puede usar tanto para tipos numéricos como textuales.
Uno de los usos más habituales es la recodificación. Supongamos que queremos recodificar los países en ISO3166 Alpha-3 para el DataFrame de empresas tecnológicas:
Ejercicio
Recodifique la columna Province del «dataset» democan de tal manera que aparezcan las provincias con el texto completo: Santa Cruz de Tenerife y Las Palmas de Gran Canaria.
Insertando y borrando filas
Podemos insertar datos en un DataFrame como filas o como columnas. Supongamos que queremos incluir una nueva empresa Cisco:
Truco: El método append() devuelve un nuevo DataFrame con los datos añadidos. Es por eso que si queremos consolidar los cambios, debemos realizar una asignación.Python
Imaginemos ahora que Facebook, Tencent e Hitachi caen en bancarrota y debemos eliminarlas de nuestro conjunto de datos:
Insertando y borrando columnas
Insertar una columna en un DataFrame es equivalente a añadir una clave en un diccionario.
Supongamos que queremos añadir una columna «Expenses» (gastos). No manejamos esta información, así que, a modo de ejemplo, utilizaremos unos valores aleatorios:
Truco: También existe la función insert() que nos permite insertar una columna en una posición determinada.
En el caso de que no nos haga falta una columna podemos borrarla fácilmente. Una opción sería utilizar la función «built-in» del(), pero seguiremos con el uso de funciones propias de pandas. Imaginemos que queremos eliminar la columna «Expenses»:
Truco: Recordar que el parámetro axis indica en qué «dirección» estamos trabajando. Véase el acceso a un DataFrame.
El parámetro inplace
Muchas de las funciones de pandas se dicen «no destructivas» en el sentido de que no modifican el conjunto de datos original, sino que devuelven uno nuevo con las modificaciones realizadas. Pero este comportamiento se puede modificar utilizando el parámetro inplace.
Veamos un ejemplo con el borrado de columnas:
Ejercicio
Añada una nueva columna Density a democan de tal manera que represente la densidad de población de cada isla del archipiélago canario.
También es posible renombrar columnas utilizando la función rename() de Pandas.
Supongamos un caso de uso en el que queremos renombrar las columnas a sus tres primeras letras en minúsculas. Tenemos dos maneras de hacerlo. La primera sería directamente creando un «mapping» entre los nombres de columna actuales y los nombres nuevos:
Otro camino para conseguir el mismo resultado es aplicar una función que realice esta tarea de manera automatizada:
Ver también:
Si en vez del parámetro nominal columns utilizamos el parámetro index estaremos renombrando los valores del índice. Se aplica el mismo comportamiento ya visto.
Nada impide asignar directamente una lista (tupia) de nombres a las columnas de un DataFrame: