Cargando Datos de un Excel en Python con Pandas

Tiempo de Lectura: 8 minutos

Compartir Blog:

Como vimos en la entrada anterior (Cargando Datos de un CSV en Python con Pandas), pandas es un paquete para Python que nos facilita la manipulación de los datos; sin embargo, dichos datos son cargados en memoria, por lo que la velocidad de respuesta en su uso, dependerá de la cantidad de datos y los recursos del equipo que estemos utilizando

Cargando Datos de un Excel

La función read_excel es la función de pandas para cargar datos de un archivo de Excel, donde posee diversos parámetros para manipular los datos al momento de cargarlos en la memoria, donde nos enfocaremos en los principales parámetros que pueden llegar a sernos de utilidad en la práctica (McKinney, 2018; Harrison y Petrou, 2020).

Según la documentación de Pandas, al igual que Harrison y Petrou (2020), internamente esta librería hace uso de los paquetes xlrd y openpyxl para leer archivos XLS y XLSX, si en dado caso no lo llegáramos a tener instalado, deberá realizarse de forma manual con pip o conda. Dentro de esta función de lectura de archivos, también podemos especificar con el parámetro engine, que paquete utilizar al momento de cargar los datos, teniendo disponibles las siguientes opciones:

  • xlrd
  • openpyxl
  • odf
  • pyxlsb

Antes de dar inicio a la explicación del funcionamiento de esta función, es importante recalcar que una hoja de cálculo, no es necesariamente un set de datos y no es requerido que las personas registre la información en un formato determinado, por lo que en algunos casos los tipos de datos no concuerdan con lo que ha registrado la persona o el software que creo la información.

Para poder iniciar la explicación, supondremos que el lector está familiarizado con la sintaxis de Python y con Jupyter Notebook, donde los archivos de datos que estaremos utilizando; así como, el archivo de Jupyter, puede ser accedidos y descargados desde el siguiente repositorio en GitHub: https://github.com/sdesignca/blog-cargando-excel-pandas

Para iniciar, importamos la librería de pandas en nuestro archivo de Jupyter Notebook, donde le colocaremos el alías, o sobre nombre pd.

import pandas as pd

Luego ubicaremos el path o la ruta donde se encuentra nuestro primer archivo de ejemplo “datos.xlsx”, en mi caso el archivo “datos.csv” se encuentra en la misma ubicación que el archivo de Jupyter, por lo que solo necesitamos colocar el nombre del archivo con su extensión como un parámetro de tipo String o cadena a la función read_excel. Está información se cargará y se asignará a la variable datos.

datos = pd.read_excel("datos.xlsx")

Mostraremos el contenido de la variable datos con la función head() del paquete de pandas:

datos.head()

Como puede observarse, la información es asignada a la variable:

01 - Cargando Datos Primer Excel

Sin embargo, como se mencionó anteriormente, una hoja de cálculo no es necesariamente un set de datos, donde podemos tener la necesidad de poder realizar una exploración de información y un análisis a partir de archivos que pueden ser generados por un software o persona, en la cual siempre mantiene su estructura. Para ejemplificar esto utilizaremos el archivo “WasteBySector.xlsx”, el cual es un reporte generado por “The Organisation for Economic Co-operation and Development (OECD)” sobre la generación de desperdicio por país, accesible desde el siguiente enlace: https://stats.oecd.org o disponible en nuestro repositorio en GitHub: https://github.com/sdesignca/blog-cargando-excel-pandas

Al abrir el reporte de Excel podemos observar que posee la siguiente estructura:

01 - Estructura de Segundo Excel

En este caso, vemos que el archivo tiene una estructura distinta al del primer ejemplo, donde la información que necesitamos extraer son los países y la cantidad de desperdicio generado por países en los diferentes años, en la cual utilizaremos varios parámetros de la función read_excel. Para ello pasaremos como String o cadena el nombre del archivo con su extensión, el cual es “WasteBySector.xlsx”.

En algunos casos la hoja de calculo puede tener varias hojas, por lo que con el parámetro sheet_name podemos seleccionar la hoja de la cual deseamos cargar la información, donde podemos pasar el número de la hoja, el nombre de la hoja o una lista de las hojas de las cuales deseamos cargar la información, en nuestra hoja de ejemplo solo existe una por lo que no es necesario colocar el nombre, pero con el fin de ejemplificarlo pasaremos como parámetro el nombre que tiene nuestra hoja: “OECD.Stat export”.

Al analizar la estructura del Excel, hay secciones que no son de nuestro interés para un análisis. Si empezamos a analizar la parte superior del Excel debemos omitir las primeras cuatro filas, es importante ver que la primera fila esta oculta en nuestro archivo, sin embargo esto no significa que no sea tomada en cuanta por la función al momento de cargar información. Para poder omitir las filas usamos el parámetro skiprows, con el valor 4.

02 - Analizando Excel

Ahora si vemos la parte inferior de los datos de nuestro Excel, también contiene información que no necesitamos para nuestro análisis, por lo cual utilizaremos el parámetro skipfooter, donde enviaremos el valor 4, ya que debemos de omitir las ultimas cuatro filas al momento de cargar nuestra información.

03 - Analizando Footer Excel

Por lo que tendríamos a este momento la siguiente instrucción:

datos = pd.read_excel("WasteBySector.xlsx",
                                            sheet_name='OECD.Stat export',
                                            skiprows=4,
                                            skipfooter=4,
                                            usecols="A,C:K")

Ahora con la función head(30) mostraremos los datos que se han cargado a nuestra variable datos, es importante mencionar que el valor 30 nos mostrará los primeros 30 registros que contenga nuestra variable, donde hemos utilizado este valor para mostrar que no han sido cargados los datos de las primeras cuatro filas y las ultimas cuatro filas.

datos.head(30)

Podemos observar en el resultado que obtendremos, aún hay información que debemos ajustar, como cambiar el nombre de la columna “Year” (año) por “Country” (País), eliminar la primera fila de los datos y la segunda columna (“Unnamed: 1”).

04 - Primeros Datos Cargados

Primero usaremos el parámetro usecols dentro de la función reas_excel para cargar unicamente las columnas don los datos que son de nuestro interés, donde podemos pasar una cadena o String con el rango de las columnas o una lista de las columnas que deseamos cargar. En nuestro caso utilizaremos la opción de String, donde indicaremos que cargue unicamente la información letra de la columna A y la información de la columna C hasta la K.

datos = pd.read_excel("WasteBySector.xlsx",
                                              sheet_name='OECD.Stat export',
                                              skiprows=4,
                                              skipfooter=4,
                                              usecols="A,C:K")

Si mostramos los datos asignado a nuestra variable con el comando head()

datos.head(30)

Se observa que la columna “Unamed: 1” ya no fue tomada en cuenta al cargar la información:

05 - Extrayendo columnas de Interes

Luego cambiaremos el nombre de la columna “Year” (año) a “Country” (país) con la siguiente instrucción. Donde el parámetro inplace con el valor True, indica que deseamos que sea cambiado de forma permanente en la información contenida en nuestra variable datos, de lo contrario este cambio no será permanente para la siguiente instrucción que realicemos con nuestro set de datos :

datos.rename(columns={'Year':'Country'},
             inplace=True)

Al mostrar nuevamente la información en nuestra variable, veremos que se ha renombrado el nombre de la columna.

06 - Cambio de nombre de columna

A este punto no se ha discutido sobre las estructura de DataFrame y Serie de Pandas; sin embargo, debemos hacer la mención de que ambas estructuras manejan de forma interna una secuencia de indexado de los registros. Es importante mencionarlo, ya que utilizaremos este indexado para la siguiente instrucción que utilizaremos.

07 - Identificando Index en DataFrame

Ahora proseguimos con la eliminación de la primera fila:

08 - Identificando Fila a Eliminar

Para hacer esto, utilizamos la función drop, donde utilizaremos el parámetro labels con el valor 0, para indicar que son los registros de la primera fila, aquí también puede ser enviada una lista de índices o columnas. Luego indicamos que eliminaremos la filas pasando el valor “index” en el parámetro axis, si quisiéramos eliminar la columna, deberíamos enviar el parámetro “columns” y por último enviaremos en el parámetro inplace con el valor True, para que el cambio se preserve en la información de nuestra variable datos:

datos.drop(labels=0,
           axis="index",
           inplace=True)

Si mostramos los datos con la función head(), veremos que se ha eliminado del DataFrame la primera fila:

09 - Set de Datos sin primera fila

Ahora reindexaremos los datos del DataFrame asignado a nuestra variable datos utilizando la función reset_index. En esta función utilizaremos el parámetro drop con el valor True, si no utilizamos esta propiedad de la función, al momento de realizar el reindexado, la secuencia de indices anteriores no sera eliminado y será creado como una nueva columna dentro de nuestro DataFrame, por lo que esta propiedad elimina por completo la secuencia de índices que vamos a remplazar. Y por último agregaremos el parámetro inplace con el valor True para que se preserven los cambios en la estructura de nuestra variable datos:

datos.reset_index(drop=True,
                  inplace=True)

Utilizaremos la función info() para poder obtener la información de la memoria utilizada, la cantidad de columnas y el detalle sobre las columnas de nuestro DataFrame, en la cual se mostrará el índice, el nombre, la cantidad de datos no nulos y el tipo de dato de las columnas.

10 - Información de DataFrame sin Transformación

Podemos observar en el resultado que de las nueve columnas con datos decimales (flotantes o floats), solo uno fue reconocido como tipo float64; donde el resto de columnas, incluyendo la del nombre de los países es del tipo object (objeto). Por lo que ahora nos corresponde realizar la transformación del tipo de dato de las columnas de datos numéricos, la cual es posible con la función to_numeric, donde el primer argumento corresponde a los datos que deseamos convertir y el segundo parámetro que utilizaremos es errors con el valor “coerce”, el cual indicará si hay un error al hacer la conversión, sea colocado un valor NaN (nulo).

for columna in datos.columns[1:]:
     datos[columna] = pd.to_numeric(
                          datos[columna],
                          errors='coerce'
                                             )

Hay que hacer mención que la propiedad columns nos permite acceder al listado de las columnas del DataFrame, en este caso para convertir los datos a decimales o floats, omitimos la primera columna, por lo que indicamos que sean tomadas desde la segunda columna (con el valor de índice 1), hasta la ultima columna existente, quedando la restricción de la siguiente forma [ 1: ]

Al obtener nuevamente la información del DataFrame con la función info(), observaremos que las columnas de datos numéricos ya es de tipo float, y nos da un dato más real de los datos que no son nulos en cada una de las columnas.

11 - Información de DataFrame con Transformación

Luego de todo este proceso de transformación, nuestro set de datos queda de la siguiente forma:

12 - Set de Datos Final

Referencias

Harrison, M., y Petrou, T. (2020). Pandas 1.x: coockbook. 2da. Edicion. Birmingham, U.K: Packt Publishing. 86 – 93 pp.

McKinney, W. (2018). Python for Data Analysis. 2 da edicion. California, E.E.U.U.: . 186 – 187 pp.

Compartir Blog:

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
Theme: Overlay by Kaira
Jocotenango, Sacatepéquez.
0
Would love your thoughts, please comment.x
()
x