
Hoy en la Buhardilla vamos a ver como podemos realizar búsquedas en los DataFrames de Pandas para encontrar los valores que cumplan las condiciones que nos interesen. En entradas anteriores vimos como poder realizar el filtrado de los DataFrames tanto para las columnas como por las filas, a partir del índice o etiqueta de las mismas. Sin embargo, no siempre conocemos la posición o nombre de la fila en la que se encuentra el valor o rango de valores que buscamos. Es por este motivo que poder realizar búsquedas con base en condiciones es tan importante. Pandas incorpora un conjunto de metodologías para poder conseguir este fin. Mediante el uso de condicionales podremos buscar valores de manera global en toda la base de datos o buscar únicamente en las columnas que seleccionemos. ¡Sin más dilación empecemos!!
La aplicación más sencilla a la hora de empezar a filtrar datos es usar un condicional para filtrar los valores del DataFrame que cumplan dicha condición. En este punto es importante destacar que este tipo de filtros se puede usar para todo el DataFrame o solo por una o varias columnas que no interese. Como en muchos casos los valores y magnitudes de las columnas no tienen relación entre ellos, la búsqueda general en todo el DataFrame no se suele utilizar prácticamente nunca (por este motivo no la vamos a tratar aquí). Así, para poder aplicar el filtro correspondiente utilizaremos la sintaxis:
df[df['Nombre_Columna'] condicion a evaluar]
En este caso el primer df hace referencia al DataFrame que vamos a analizar, entre [] introduciremos las condiciones que queremos evaluar, en este caso df[‘Nombre columna’] indica en que columna queremos que se evalúe la condición, aquí es importante remarcar que se puede aplicar tanto a una única columna como a una lista de columnas (df[‘Nombre columna1’, ‘Nombre columna2’, ‘Nombre columna3’]). La parte final es definir la condición que queremos evaluar, para tal fin utilizaremos los operadores booleanos:
| <= | Menor o igual |
| < | Menor |
| >= | Mayor o igual |
| < | Mayor |
| == | Igual |
| != | Diferente |
También podemos aplicar más de un condicional a la vez al hacer la selección. En este caso la cosntrucción quedaria así:
df[df[‘Nombre_Columna1’] condición a evaluar1 bool df[‘Nombre_Columna2’] condición a evaluar2]
En este caso el operador bool es el encargado de vincular las condiciones marcadas, pudiendo ser que se tengan que cumplir todas al mismo tiempo (&) o solo una de ellas (|). El ejemplo se ha preparado para dos condiciones, pero se pueden concatenar tantas condiciones como sea necesario para satisfacer nuestra demanda.
| & | Operador AND (y). Se tienen que cumplir todas condiciones al mismo tiempo |
| | | Operador OR (o). Únicamente se tiene que cumplir una de las condiciones |
En el caso de que en la columna que estemos aplicando las condiciones sea un string (cadena de caracteres) en este caso también podemos aplicar las funciones específicas de los strings como pueden ser la fragmentación de la cadena o la búsqueda por índice, así como la utilización de expresiones regulares. La utilización de las mismas permite una mayor profundidad y complejidad en las búsquedas o filtrados que hagamos. En el caso de las expresiones regulares las más usadas son:
| [] | Para indicar el conjunto de caracteres que quiere buscar |
| . | Cualquier carácter puede sustituir al punto(exceptuando el de nueva línea) |
| ^ | Empieza por el carácter o conjunto indicado |
| $ | Termina por el conjunto o carácter indicado |
| .* | Pueden existir cero o más coincidencias en las posiciones indicadas |
| .+ | Existen una o más coincidencias en las pociones indicadas |
| .? | Puede existir cero o una coincidencia en la posición indicada |
| {} | Específica exactamente el número de caracteres que tiene que háber dentro del string seleccionado |
Una vez hemos aplicado los filtros para obtener la información, obtendremos un nuevo dataset que será un subset del original en el que aparecerá todos los registros en los que se cumpla el filtro aplicado. En muchas ocasiones solo nos va a interesar la información que está contenida en algunas columnas del total, con lo que tener un número excesivo de columnas nos puede dificultar un poco la interpretación de los datos o información que buscamos. Así, una buena práctica para obtener sola las columnas que son realmente interesantes para nosotros consiste en pasarle un listado de las columnas que realmente nos interesan al final de la sentencia, de la siguiente manera.
df[df[‘Nombre_Columna1’] condición a evaluar1 bool df[‘Nombre_Columna2’] condición a evaluar2] [Nombre_Columna_Mostrar1, Nombre_Columna_Mostrar2]
Aunque muchas veces las columnas por las que estamos realizando el filtro son columnas de las que queremos conocer el resultado, en otras ocasiones no va a ser así, con lo que el nombre de las columnas que queremos mostrar y por las que estamos aplicando el filtro no tienen que coincidir necesariamente, aunque algunas veces así sea. Cuando trabajemos con datasets muy grandes, esta estrategia nos irá muy bien para poder concentrarnos y analizar sola la información relevante para nosotros y no perdernos en un mar de datos.
Finalmente, un truco que puede ser de utilidad, en el caso de que estemos realizando un filtrado siempre podemos negar la condición o filtro aplicado, es decir, en vez de que nos muestre todas las filas que cumplen la condición marcada nos va a mostrar todas las filas que no la cumplan. Si bien a priori esto puede parecer una aplicación sin mucha importancia, la verdad es que en algunos casos es mucha más fácil filtrar negando una condición que aplicar una larga lista de condiciones extras para poder garantizar que estamos obteniendo todos los datos. La aplicación de la negación se aplicaría de la siguiente forma.
df[~df[‘Nombre_Columna’] condicion a evaluar]
Con esto hemos visto como podemos filtrar los datasets de manera rápida y fácil, tanto al aplicar una condición única como al aplicar distintas condiciones que se tienen que cumplir al mismo tiempo. Con las herramientas mostradas aquí podremos empezar a sacar el máximo potencial a la información que tengamos almacenada en los DataFrames de trabajo.
¡Un saludo y hasta la próxima aventura!!!
Deja un comentario