Pandas es una de las principales librerías de Python, que es un lenguaje de programación orientado a objetos de alto nivel muy popular entre los Data Scientists. Las estructuras más utilizadas en este módulo son las Series y los DataFrames. A diferencia de las Series, que son objetos correspondientes a paneles unidimensionales, los DataFrames son paneles bidimensionales compuestos por filas y columnas, que permiten destacar las relaciones entre las distintas variables de la serie de datos.
Un DataFrame es una serie de Series Pandas indexadas por un valor. En este artículo, presentaremos la estructura de los DataFrames y luego veremos sus diferentes atributos y métodos básicos, y explicaremos su utilidad y funcionamiento.
1) ¿Cómo se presenta un DataFrame?
El formato de estas estructuras puede compararse con los diccionarios de Python. Efectivamente, las claves son los nombres de las columnas y los valores son las Series. Su estructura puede considerarse similar a la de una hoja de cálculo de Excel.
Cada fila contiene datos específicos de varias columnas, que son variables. El nombre de las filas de un DataFrame se llama «index» que, por defecto, empieza siempre por 0.
Sin embargo, se puede indexar las filas de un DataFrame por cualquier valor: ID de cliente o incluso, unidad de tiempo. En cuanto al nombre de las columnas, están etiquetadas con el nombre de una variable específica a la que se le dan diferentes valores. Los valores de estas variables pueden adoptar muchos formatos de datos. Cada columna se asocia a un tipo de datos, por ejemplo una cadena de carácter (objeto) que se relaciona con datos cualitativos, o una columna con un tipo integrador, que corresponderá a números enteros. El tipo de las variables se puede cambiar según las necesidades utilizando el método astype().
2) Atributos y métodos que no deben faltar
Hay muchas formas de manipular los DataFrames. Los atributos y los métodos de esta estructura Pandas son muy numerosos. Este artículo se centrará esencialmente en los métodos básicos para aprender a manejar los DataFrames.
A- Importación y observación de la serie de datos
Importación e información de las variables
Para importar una serie de datos, la librería Pandas propone un método muy práctico que es pd.read_csv(). Si el archivo que contiene la serie de datos está en otro formato que no sea el de Comma Separated Value, basta con cambiar la terminación del método por el tipo de archivo correcto. Por ejemplo, un archivo de Excel se importará de la siguiente manera: pd.read_excel(). Este método importa la serie de datos en una estructura DataFrame.
Después se debe utilizar el método info() para obtener la información sobre el DataFrame. Este método devuelve el tipo de las variables, el número de columnas, el número de filas no nulas, el tipo de índice, el tamaño de la memoria de la serie de datos, etc. También se recomienda utilizar el método describe(), que permite conocer algunas estadísticas descriptivas sobre el DataFrame. Por ejemplo, permite saber el valor mínimo y máximo de cada variable, los cuartiles o incluso la desviación tipo de las columnas. Este método es útil para hacerse una idea de la distribución de las variables.
Primera vista del DataFrame
Cuando se importa la serie de datos, es necesario tener una visión general del DataFrame. El primer paso es utilizar el atributo shape, que permite conocer la dimensión del DataFrame y devolver una tupla (número_de_filas, número_de_columnas). Para entender la serie de datos, hay tres métodos muy útiles para ver las filas del DataFrame :
El método head() devuelve las cinco primeras filas del DataFrame, si no se especifica un número entre paréntesis.
- Por otro lado, el método tail() permite visualizar las últimas cinco líneas del DataFrame.
Estos dos métodos permiten visualizar el principio y el final de la serie de datos. Esto incluye una ventaja real para los datos de tipo Times Series, para tener una visión simple de la evolución de los datos en el tiempo, pero también permite, en un caso más general, ver si los datos mantienen un cierto sentido: si el principio del DataFrame difiere considerablemente del final del mismo, es necesario comprender la causa e intentar resolver este problema antes de cualquier manipulación de los datos.
Si se desea una visualización más aleatoria de las filas, se debe preferir el método sample(). Devuelve las filas de forma aleatoria. Por defecto, el resultado solo devuelve una fila del DataFrame. Por lo tanto, es preferible escribir un número entero entre paréntesis para visualizar un mayor número de filas y, en consecuencia, hacerse una mejor idea del contenido del DataFrame.
Slicing
Podemos filtrar nuestros datos utilizando el slice. Por ejemplo, df[:2] devuelve las dos primeras filas de nuestro DataFrame. No hay que olvidar que el último número es exógeno al resultado, lo que significa que en el ejemplo, el slicing devolverá las filas al índice 0 y 1.
B- Manipulación de datos
Añadir y modificar datos
Como se explicó en la introducción, los DataFrames son tablas bidimensionales, que corresponden a los ejes de las filas (eje = 0) y de las columnas (eje = 1). Se pueden añadir tantas filas o columnas como sea necesario, especificando el eje en el que queremos añadir estos nuevos valores.
Lo interesante de los DataFrames es que es muy fácil recuperar, cambiar, cargar o buscar datos en esta estructura. Imaginemos un DataFrame indexado por tiempo, y que queremos recuperar todos los datos del 18 de diciembre de 2020. Con la función iloc, es posible recuperar todos los datos de las variables de esa fecha. Además, es posible sustituir un valor de una de las columnas con esa función especificando el índice y el nombre de la columna. Por ejemplo, si el 18 de diciembre de 2020 no hay ningún valor, pero sabemos que el valor real es 25, simplemente podemos hacer df.iloc[index_de_la_línea, “columns”] = 25.
Indexación booleana
Se pueden filtrar los datos según una o varias condiciones, lo que permite recuperar datos específicos o concretos para una necesidad precisa, y revelar toda su información útil y necesaria. Es lo que se llama indexación booleana. Esta técnica permite saber si el valor de una prueba es Verdadero o Falso y devuelve el resultado en forma de vector. Por ejemplo, tenemos una serie de datos donde cada columna es un mes del año, el DataFrame es de tipo DateTimeIndex, y queremos obtener las filas en las que el mes de enero es estrictamente superior a 25, entonces la forma de escribir el código es: df[df[«enero»] > 25]. Este método de indexación booleana permite filtrar los datos para devolver solo las filas que cumplen la condición «valores superiores a 25 para el mes de enero». Por lo general, la indexación booleana se escribe con el siguiente formato: df[«condición»].
Las columnas
Los DataFrames permiten manipular y almacenar una gran cantidad de datos. Sin embargo, en un contexto profesional, a menudo hay que tratar con grandes volúmenes de datos y con variables muy numerosas. El aumento del número de variables tiene un impacto particular en la organización de los DataFrames. En efecto, cuanto mayor es el número de columnas, menos fácil es visualizar los nombres de las variables. Para resolver este problema, hay varias manipulaciones posibles.
Si el DataFrame tiene diez variables diferentes, se puede saber cuáles son sus nombres utilizando el atributo df.columns. Pero cuando la serie de datos tiene ochocientas columnas, la visualización de los nombres de las variables no será completa. Para resolver este problema, se puede utilizar el método df.columns.toList(), que permite almacenar los nombres de las columnas en una lista de Python. Además, para saber si hay filas que no son únicas, que pueden ser duplicadas, el método df[«columns»].value_counts() es una forma sencilla de comprobarlo. Para facilitar la lectura, si estamos acostumbrados a trabajar con paneles, se puede añadir to_frame() al final del código para visualizar los resultados en formato DataFrame. Este método de value_counts() nos permite conocer la ocurrencia de las modalidades de una variable.
Los valores perdidos
Cuando se trabaja en un proyecto de Data Science es muy común lidiar con valores perdidos o valores atípicos. Los DataFrames permiten resolver este problema con una facilidad desconcertante. Por ejemplo, en el caso de datos cualitativos, uno de los métodos para sustituir los valores que faltan es tratar el modo de la modalidad. Para ello, basta con utilizar el siguiente código para conseguir esa manipulación: df[columna].fillna(df[columnas].mode()[0]). O, por ejemplo, sustituir los valores cuantitativos por la media.
De este modo, los DataFrames permiten potenciar las correlaciones y las relaciones entre los datos gracias a las distintas manipulaciones posibles, definir filtros sobre los datos presentados a los equipos y almacenar y manipular datos masivos. En conclusión, los DataFrames permiten que los profesionales de la Data hagan que sus datos hablen, decidiendo las condiciones y las manipulaciones que se van a realizar.
Si quieres aprender a hacer hablar a los datos, nuestros cursos de formación de data Science son para ti.