Dentro de las operaciones más poderosas que se pueden aplicar sobre un "data frame" están las operaciones de filtrado. Estas nos permiten seleccionar un conjunto de registros con base en alguna condición sobre los datos, sobre su posición o sobre los índices del "data frame". En este video, veremos varias técnicas para filtrar datos de un "data frame" y algunos detalles puntuales, pero muy importantes, sobre el comportamiento de estas operaciones. Para facilitar las operaciones que estudiaremos a continuación, en primer lugar, vamos a ordenar nuestros datos "categóricos" de acuerdo al valor de la columna "Estado Contrato". Esto lo logramos usando la función "sort_values", indicando qué columna o columnas queremos utilizar para ordenar los valores. De esta manera, tendremos un nuevo "data frame" con el nombre "ordenados", en el que los registros estarán ordenados de acuerdo al estado. Primero tendremos todos los contratos activos, luego los borradores y así sucesivamente, hasta llegar a los terminados. Esta operación de ordenamiento tiene dos características muy importantes. Por un lado, en el "data frame" original teníamos los registros organizados de acuerdo con el índice. Es decir, que el primer registro era el que tenía la etiqueta cero, luego venía el de la etiqueta uno y así hasta el último registro que tenía la etiqueta 661.634. Después de reordenar los registros de acuerdo a otra columna, el índice ya no coincide con las posiciones. Por ejemplo, el registro de la primera posición tiene asociada la etiqueta 183.364. La otra característica súper importante que tenemos que tener en cuenta, es que los datos en el "data frame" ordenados son los mismos que había en el "data frame" "categórico", no son una copia. Esto significa que si cambiamos un valor en cualquiera de los "data frames", veremos reflejado el cambio en el otro. Este comportamiento, donde en lugar de crear copias de los datos se reorganizan o se filtran los datos originales, es el comportamiento normal de Pandas y aplica para casi todas las operaciones que estudiaremos a continuación. Veamos ahora el primer mecanismo para extraer información de un "data frame", la función "iloc". Al igual que con las series, esta función nos permite obtener un registro o un conjunto de registros, a partir de su posición dentro del "data frame". Por ejemplo, al aplicar "iloc" sobre el "data frame" que está ordenado y utilizar el valor cinco como parámetro dentro de los paréntesis cuadrados, obtenemos la información de un contrato activo del sector de salud y protección social. Este es el registro que se encuentra en la posición número cinco del "data frame" ordenado y tiene como etiqueta el número 200.696. Es decir, que para encontrar este mismo registro en el "data frame" original, que está ordenado por el índice, habríamos tenido que buscarlo en la posición 200.696. Con "iloc" también se puede usar "slicing" e indicar el rango dentro del que se quiere extraer los valores. Por ejemplo, al indicar los valores cinco dos puntos diez, obtenemos desde la posición cinco hasta la nueve. Recordemos que la última posición nunca está incluida en un "slice". Por otro lado, tenemos la función "loc" en los "data frames", la cual también nos permite extraer valores, pero utilizando la etiqueta o el valor del índice. En el ejemplo que estamos viendo, al usar la función "loc" con el valor cinco, obtenemos el registro que tiene la etiqueta cinco. En este caso se trata de la información de un contrato cancelado del sector Inclusión Social y Reconciliación. Para terminar, la función "loc" también soporta "slicing", pero se debe tener muchísimo cuidado en su aplicación, porque está basado en las etiquetas de los registros. En el ejemplo de la izquierda, se está haciendo "slicing" entre cinco y diez con "loc" y el resultado fueron más de 300.000 registros. Esto ocurre porque en los datos ordenados por estado del contrato, el registro con la etiqueta diez se encuentra mucho más adelante que el registro con la etiqueta cinco. Por el contrario, al intentar hacer "slicing" entre cuatro y nueve, el resultado fue un "data frame" vacío, lo cual posiblemente indique que el registro con etiqueta cuatro se encuentra más adelante que el registro con la etiqueta nueve. Detengamos un momento la explicación y revisemos una pregunta. Hablemos ahora de algo mucho más poderoso. La selección de filas utilizando condiciones. Para empezar, usemos "iloc" para quedarnos con los cuatro primeros registros de nuestro "data frame" ordenados. Ahora, supongamos que sólo queremos quedarnos con el primer y el último registro de nuestra muestra. Para esto agregué una columna en la gráfica con el valor "true" para las filas que quiero conservar y el valor "false" para las filas que no quiero. Estos valores los podemos ver como una serie o como una columna adicional. Si utilizamos esta lista de valores booleanos como selector de nuestro "data frame", obtendremos precisamente lo que queríamos: un nuevo "data frame", donde solo aparecen el primero y el último registro. Veamos ahora cómo aplicar esta misma idea sobre condiciones más interesantes. Primero, veamos el resultado de extraer la columna "Estado Contrato" y compararla con el valor activo. El resultado es una serie con valores booleanos, que dependen del estado del contrato correspondiente, en el "data frame" "categóricos". En total, tenemos un valor verdadero o falso por cada registro del "data frame". Si utilizamos esta expresión como selector, estaremos usando la serie para seleccionar cuáles registros nos interesa conservar. El resultado será un "data frame" en el que solo aparecerán los registros cuyos contratos estén en estado activo. También es posible mezclar condiciones en los selectores, pero para eso es necesario utilizar los operadores de Python para operar bits, "ampersand" y "pipe" o "barra". La sintaxis es un poco extraña, así que le recomendamos observar los siguientes ejemplos con mucho cuidado. En la figura de arriba, podemos ver que esta vez tenemos un selector más complejo. Primero calculamos una serie, donde habrá un valor verdadero para los registros en los que el estado del contrato sea activo y después, calculamos una serie donde habrá un valor verdadero para los registros en los que el estado del contrato sea en ejecución. Entre las dos series encontramos el operador "pipe" o barra, el cual nos indica que queremos hacer una operación "or" entre las dos series. Para los registros donde haya un valor verdadero en cualquiera de las series, el resultado será verdadero, para el resto será falso. Tenga cuidado. Tenga cuidado y no vaya olvidar los paréntesis alrededor de cada una de las condiciones, porque cambiaría totalmente el significado de la expresión. Finalmente, utilizamos el resultado de la operación lógica como selector y el resultado es un "data frame", donde solo aparecen los contratos cuyo estado es activo o en ejecución. En este segundo ejemplo, usamos las mismas ideas para extraer solo los contratos firmados en febrero del 2020. Para esto utilizamos el operador "ampersand", que indica la operación "and" y utilizamos las operaciones mayor, igual y menor para comparar las fechas. Veamos ahora una pregunta antes de continuar. Para concluir este video, estudiamos rápidamente la fusión "isin", la cual recibe un conjunto de valores permitidos e indica si los valores de una serie se encuentran o no dentro de esos valores permitidos. En la imagen, usamos la función "isin" sobre la columna sector, para extraer únicamente los contratos que pertenezcan a los sectores de Servicio Público y Deportes. Vamos a concluir el video en este punto, porque ya estudiamos los métodos más importantes para extraer datos de un "data frame". Con ellos, usted será capaz de hacer análisis muy interesantes sobre sus datos. Estos mecanismos también le servirán de guía para estudiar los otros mecanismos que ofrece Pandas para seleccionar registros y que lamentablemente acá no alcanzamos a estudiar. Lo invitamos entonces a revisar la documentación de la librería, para saber un poco más sobre estas otras herramientas.