Etiqueta: CSV

Cargando Datos de un Excel en Python con Pandas

Cargando Datos de un Excel en Python con Pandas

Compartelo

RSS
Siguenos por Email
LinkedIn
Facebook
Twitter
Whatsapp

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()

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.

Compartelo

RSS
Siguenos por Email
LinkedIn
Facebook
Twitter
Whatsapp
Cargando Datos de un CSV en Python con Pandas

Cargando Datos de un CSV en Python con Pandas

Compartelo

RSS
Siguenos por Email
LinkedIn
Facebook
Twitter
Whatsapp

¿Qué es Pandas?

Es un paquete que se ha tornado esencial para el análisis de información en Python, ganando popularidad desde el 2010. Dicho paquete fue elaborado por Wes Mckinney en el 2008, donde su nombre se deriva de “panel data”, término utilizado para el conjunto de datos estructurados y multidimencionales (Harrison y Petrou, 2020; Stepanek, 2020).

Este paquete facilita la manipulación, preparación y la limpieza de datos estructurados, como archivos CSV, hojas de cálculo (como Excel) o bases de datos estructuradas. Esta librería cuenta con dos tipos de estructuras; la estructura de Serie, conformada por una secuencia de valores similares al tipo de NumPy. Y la otra estructura disponible en este paquete es el DataFrame, el cual representa una tabla de datos que contiene una colección de columnas que pueden ser de diferentes tipos (numérico, alfanumérico, booleano, etc.), teniendo está estructura índices de columnas y filas, en la que la información puede ser almacenada en bloques de una o más dimensiones, haciendo más fácil su selección, combinación y transformación de información (Harrison y Petrou, 2020; Walker, 2020, McKinney, 2018).

Cargando Datos de un CSV

La función para poder cargar a memoria los datos de un archivo CSV con pandas se llama read_csv, la cual cuenta con diversos parámetros para poder manipular la lectura del archivo y obtener los datos. Viendo los principales parámetros de manipulación que nos pueden llegar a servir en la práctica.

Esta función de Pandas es una de las más completas, en términos de opciones para normalizar los datos, pudiendo incluso manejar dos motores de análisis; uno de estos es el motor de C, el cual es más eficaz que el motor de Python, ya que cuenta con mayor precisión en valores flotantes, que puede ser especificado utilizando el parámetro float_precision dentro de la función read_csv. Sin embargo, se debe indicar mediante el parámetro engine con una ‘c’ dentro de dicha función, de lo contrario utilizará por defecto el motor de Python.

Para poder iniciar la ejemplificación del uso de esta función, supondremos que el lector está familiarizado con la sintaxis de Python y con Jupyter Notebook, donde el archivo de datos que estaremos utilizando; así como, el archivo de Jupyter, puede ser accedido y descargado desde el siguiente repositorio en GitHub: https://github.com/sdesignca/blog-cargando-csv-pandas

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

import pandas as pd

Luego ubicaremos el path o la ruta donde se encuentra ubicado nuestro archivo “Datos.csv”. En nuestro caso el archivo se encuentra en la misma ubicación donde está nuestro 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_csv y la información cargada la asignara a la variable datos.

datos = pd.read_csv("Datos.csv")

En unos casos, podemos llegar a tener otro tipo de delimitador en nuestros archivos CSV, por ejemplo un punto y coma (;), por lo que podemos utilizar el parámetro delimiter y especificar cual será el carácter que está delimitando la información entre si. En el archivo CSV de ejemplo el delimitador es una coma (,), este es el parámetro por defecto que toma la función read_csv, sin embargo para ejemplificar su uso dentro de la función incluiremos la coma (,) con el parámetro delimiter.

datos = pd.read_csv("Datos.csv",delimiter=',')

Al ejecutar esta instrucción y asignarla a la variable datos. Mostraremos su contenido utilizando la función head() de Python:

datos.head()

Al ser ejecutado, mostrará la información cargada en la variable desde el archivo; sin embargo, los caracteres especiales no son desplegados:

01 - Resultado primera carga de datos

Para poder corregir esto, vamos a pasar el parámetro encoding en la función read_csv, con el valor latin1 (si se desean conocer que otras opciones están disponibles se puede visitar el link https://docs.python.org/3/library/codecs.html#standard-encodings), quedando la instrucción:

datos = pd.read_csv("Datos.csv",delimiter=',',encoding='latin1')

Al mostrar nuevamente los valores con la función head(), obtendremos la información cargada en el DataFrame con la codificación latina, mostrando así los caracteres especiales contenidos:

02 - Resultado carga de datos con encodign

En este punto, ya tenemos nuestra información cargada en nuestra variable datos, con los caracteres especiales disponibles; sin embargo, tenemos una columna que contiene fechas y podríamos pensar que estos valores son de tipo fecha (o datetime), por lo que revisaremos el tipo de dato de cada una de las columnas con la siguiente propiedad del DataFrame de Pandas:

datos.dtypes

Obteniendo el siguiente resultado:

03 - Primer resultado sin fechas parseadas

Como se puede observar, la columna “Fecha de Ingreso” es de tipo object, para poder cambiar esto, podemos convertir el tipo de la columna, luego de cargar la información; sin embargo, en este documento, estamos mostrando el uso de la función read_csv, por lo que vamos a convertir esta columna a tipo fecha desde el momento en el que se carga la información utilizando el parámetro parse_dates, donde enviamos como parámetro un arreglo con el nombre de las columnas que deseamos convertir a tipo fecha, en nuestro caso el arreglo seria [‘Fecha de Ingreso’]:

datos = pd.read_csv("Datos.csv"
                     ,delimiter=','
                     ,encoding='latin1'
                     ,parse_dates=['Fecha de Ingreso']
                     )

Luego de ejecutar nuevamente esta instrucción y cargar los datos del archivo a la variable datos, verificamos nuevamente el tipo de datos de las columnas:

datos.dtypes

Al obtener el resultado, podemos observar que la columna “Fecha de Ingreso” ya es de tipo fecha o datetime

04 - Resultado con fechas parseadas

Sin embargo en un análisis no siempre es necesaria toda la información contenida en un archivo, por lo que podemos pasar como parámetro las columnas que deseamos sean cargadas en la memoria. Esto lo hacemos pasando un arreglo con el nombre de las columnas que contiene nuestro archivo CSV en el parámetro usecols, en nuestro caso vamos a cargar únicamente las columnas “Código”, “Fecha de Ingreso”, “Sueldo Base” y “Bonificación”:

datos = pd.read_csv("Datos.csv"
                    ,delimiter=','
                    ,encoding='latin1'
                    ,parse_dates=['Fecha de Ingreso']
                    ,usecols=['Código','Fecha de Ingreso','Sueldo Base','Bonificación']
                    )

Al ejecutar este comando y hacer uso de la función head() sobre la variable que contiene el DataFrame, obtenemos unicamente la información de las columnas que hemos especificado.

05 - Resultado carga de datos con columnas especificas

Estos suelen ser los parámetros de más ayuda al momento de cargar un archivo CSV, sin embargo existen más parámetros dentro de la función read_csv que nos pueden llegar a ser de utilidad, por lo que si se desea profundizar en las demás opciones que no fueron cubiertas, puede visitarse el siguiente link de documentación:

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html

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.: . 124 – 130 pp.

Stepanek, H. (2020). Thinking in Pandas: How to use the Python Data Analysis Library the Right Way. Portland, E.E.U.U: Apress. 67 – 69 pp.

Walker, M. (2020). Python Data Cleaning: cookbook. Birmingham, U.K: Packt Publishing. 2 – 8 pp.

Compartelo

RSS
Siguenos por Email
LinkedIn
Facebook
Twitter
Whatsapp
Theme: Overlay by Kaira
Guatemala