Microsoft Excel es uno de los programas más utilizado para la visualización y análisis de datos en la empresa. La omnipresencia de este programa hace que muchos usuarios se decanten por el formato xlsx (o xls) para exportar sus conjuntos de datos. Por esto saber leer y escribir archivos Excel en Python es clave para trabajar de forma óptima en muchos entornos. A pesar de que este no sea el formato favorito de muchos científicos de datos. Ya que estos generalmente prefieren trabajar con archivos en formato CSV.
En esta entrada se va a repasar cómo se puede guardar y leer archivos en formato Excel en Python utilizando la librería pandas.
Guardado de archivos Excel en Python
Antes de poder guardar un archivo Excel desde Python es necesario disponer de un dataframe. Por lo que se puede crear uno de ejemplo, como se hizo al hablar de los archivos CVS:
import pandas as pd data = {'first_name': ['Sigrid', 'Joe', 'Theodoric','Kennedy', 'Beatrix', 'Olimpia', 'Grange', 'Sallee'], 'last_name': ['Mannock', 'Hinners', 'Rivers', 'Donnell', 'Parlett', 'Guenther', 'Douce', 'Johnstone'], 'age': [27, 31, 36, 53, 48, 36, 40, 34], 'amount_1': [7.17, 1.90, 1.11, 1.41, 6.69, 4.62, 1.01, 4.88], 'amount_2': [8.06, "?", 5.90, "?", "?", 7.48, 4.37, "?"]} df = pd.DataFrame(data, columns = ['first_name', 'last_name', 'age', 'amount_1', 'amount_2'])
Ahora para exportar los datos en formato Excel simplemente se ha utilizar el método to_excel
del dataframe. En esta ocasión se ha de indicar el archivo en el que se desea guardar los datos mediante una cadena de texto. Opcionalmente se puede indicar también el nombre de la hoja del libro Excel mediante la propiedad sheet_name
. El contenido del archivo generado el siguiente código se muestra en la figura.
df.to_excel('example.xlsx', sheet_name='example')
Lectura de archivos Excel en Python
El proceso de lectura se realiza con el método read_excel
de pandas. En el caso de que el libro contenga más de una hoja se puede indicar el nombre de la que se desea importar mediante el método sheet_name
. Cuando no se indique una cargara el contenido de la primera hoja del libro.
df = pd.read_excel('example.xlsx', sheet_name='example')
first_name last_name age amount_1 amount_2 0 Sigrid Mannock 27 7.17 8.06 1 Joe Hinners 31 1.90 ? 2 Theodoric Rivers 36 1.11 5.9 3 Kennedy Donnell 53 1.41 ? 4 Beatrix Parlett 48 6.69 ? 5 Olimpia Guenther 36 4.62 7.48 6 Grange Douce 40 1.01 4.37 7 Sallee Johnstone 34 4.88 ?
Por defecto el método utiliza la primera línea del fichero como cabecera para asignar los nombres a las columnas. En el caso de que el archivo no disponga de cabecera se puede evitar este comportamiento asignando None
a la propiedad head
.
df = pd.read_excel('example.xlsx', header=None)
0 1 2 3 4 5 0 NaN first_name last_name age amount_1 amount_2 1 0.0 Sigrid Mannock 27 7.17 8.06 2 1.0 Joe Hinners 31 1.9 ? 3 2.0 Theodoric Rivers 36 1.11 5.9 4 3.0 Kennedy Donnell 53 1.41 ? 5 4.0 Beatrix Parlett 48 6.69 ? 6 5.0 Olimpia Guenther 36 4.62 7.48 7 6.0 Grange Douce 40 1.01 4.37 8 7.0 Sallee Johnstone 34 4.88 ?
El archivo que se ha utilizado en esta ocasión tiene cabecera, por lo que esta se ha importado como la primera fila. En caso de que se desee ignorar una o más filas se le puede indicar mediante la propiedad skiprows
.
df = pd.read_excel('example.xlsx', header=None, skiprows=1)
0 1 2 3 4 5 0 0 Sigrid Mannock 27 7.17 8.06 1 1 Joe Hinners 31 1.90 ? 2 2 Theodoric Rivers 36 1.11 5.9 3 3 Kennedy Donnell 53 1.41 ? 4 4 Beatrix Parlett 48 6.69 ? 5 5 Olimpia Guenther 36 4.62 7.48 6 6 Grange Douce 40 1.01 4.37 7 7 Sallee Johnstone 34 4.88 ?
En el caso de que se desee indicar un nombre concreto para cada una de las columnas, difernte al de la hoja, se puede indicar mediatne la propiedad names
.
df = pd.read_excel('example.xlsx', skiprows = 1, names=['UID', 'First Name', 'Last Name', 'Age', 'Sales #1', 'Sales #2'])
UID First Name Last Name Age Sales #1 Sales #2 0 1 Joe Hinners 31 1.90 ? 1 2 Theodoric Rivers 36 1.11 5.9 2 3 Kennedy Donnell 53 1.41 ? 3 4 Beatrix Parlett 48 6.69 ? 4 5 Olimpia Guenther 36 4.62 7.48 5 6 Grange Douce 40 1.01 4.37 6 7 Sallee Johnstone 34 4.88 ?
Conclusiones
En esta entrada se ha explicado cómo trabajar con archivos Excel en Python gracias a la librería pandas. El formato de Microsoft Excel es uno de los más utilizados en muchos entornos, por lo que conocer estas herramientas puede ahorrar mucho trabajo.
Lo aprendido en esta entrada permite aumentar el conjunto de herramientas para trabajar con archivos de datos en Python. Completando lo visto para archivos CSV y JSON que se han visto en entradas anteriores.
En el caso de que se quiera guardar más de un DataFrame en un mismo libro de Excel es necesario guárdalo en diferentes hojas, lo que requiere llevar a cabo unos pasos adicionales.
Imágenes: Pixabay (Pexels)
Luis Enrique dice
consulta, cuando ejecuto este paso df.to_excel(‘example.xlsx’, sheet_name=’example’) no me genera el archivo excel en que ruta se guarda?
Daniel Rodríguez dice
Al indicar solamente el nombre del archivo, no una ruta absoluta, este se guardará en la carpeta de trabajo actual. La carpeta en la que se está ejecutando Python se puede obtener con
os.getcwd()
. Es decir, se puede usar el siguiente código para obtener la ruta:Tirso Meneses dice
Hola Daniel, gracias por tu aporte en relación con el uso de excel, lo estoy usando y me resulta leer y escribir pero si deseo escribir más de una hoja en el mismo archivo excel, uso la instrucción
df.to_excel(“archivo”, sheet:name=”hoja1″, index=False)
más de una vez, para agregar una hoja al archivo, sobreescribe el archivo y finalmente obtengo un archivo excel sólo con la última hoja que mandé a grabar, las otras se pierden.
¿Me puedes ayudar para solucionar este problema?
Muchas gracias de antemano.
Daniel Rodríguez dice
Gracias, en esto casos hay que hacer un paso adiciona que es crear un objeto ExcelWriter para que no se sobrescriban los archivos. Por ejemplo, para guardar dos dataframees se puede hacer:
writer = pd.ExcelWriter('archivo.xlsx')
df1.to_excel(writer, sheet_name="hoja1", index=False)
df2.to_excel(writer, sheet_name="hoja2", index=False)
writer.save()
writer.close()
Ricardo dice
Excelente!!! Me pasaba lo mismo! Gracias!
Ireth dice
Hola Daniel! muchas gracias por tu aporte!
estoy aprendiendo y me cuesta cada cosa.. probé esas líneas que ponés, me hizo instalar un montón de cosas jeje pero pude ejecutar.. lo que no me funcionó y no entiendo por qué es la línea donde pones df2.to_excel… esa tuve que comentar,
luego sí me generó el archivo con información.. y esa info de dónde la saca??
otra cosita, quise agregar
import os
os.getcwd()
pero no se muestra nada.. o qué debo poner entre ()?
Muchas gracias y saludos!
Daniel Rodríguez dice
En el ejemplo usamos la librería Pandas, por eso puede que fuese necesario instalar algunas cosas. Una librería que facilita mucho el manejo de tablas de datos.
En cuanto a las preguntas en las variables
df
se guardan objetos DataFrame de Pandas que son objetos en los que se guardan los datos, de ahí salen los datos. Por otro lado, el error puede ser debido a varias causas, como que la carpeta donde se inicio el proceso ya no exista. Pero es complicado saberlo sin el error en concreto.franklin chiluisa dice
Estimado
Como puedo Importe varios archivos de Excel en python y concatenelos en un marco de datos.
Mi ruta es la siguiente:
D:\1.2 CARPETAS PARA REPORTES\Totaten x años\2020
Mi carpeta 2020 tiene los siguientes archivos:
Enero 2020
febrero 2020
marzo 2020
Cada archivo excel tiene dos o mas hojas ejemplo
HS_T7T5TEN_20200301_20200331 1
HS_T7T5TEN_20200301_20200331 2
HS_T7T5TEN_20200301_20200331 3
Quisiera unificar todos estos archivos en uno solo por favor
Daniel Rodríguez dice
Para trabajar con múltiples hojas hay que hacer unos pasos adicionales que se explican en esta entrada.
franklin Chiluisa dice
Estimado
Hice esto pero lo que veo es que solo me lee las primeras hojas como podría mejorarlo para que me lee todas las hojas existentes en cada archivo.
link=r’D:\1.2 CARPETAS PARA REPORTES\Totaten x años\2021′
os.chdir(link);
lista_archivos= glob.glob(link+os.sep+’*.xlsx’)
archivos = []
for i in lista_archivos:
a= pd.read_excel(i)
archivos.append(a)
a=pd.concat(archivos,ignore_index=False)
Daniel Rodríguez dice
Para leer habría que obtener primero el listado de hojas en un libro Excel y posteriormente iterar sobre estas. Para obtener el listado se puede usar la clase ExcelFile de Pandas. Por ejemplo, algo como
excel_file = ‘file.xlsx’
xls = pd.ExcelFile(excel_file)
for name in xls.sheet_names:
pd.read_excel(excel_file, name)
Florencia Fernández dice
Gracias, es de mucha ayuda su aporte. Le hago una consulta, tengo un bucle anidado y guardo los valores que genera en una lista; debo exportar a un excel sólo algunas variables de esa lista. Cómo puedo hacer para para exportar algunas partes de una lista?
Desde ya gracias y saludos!
Daniel Rodríguez dice
Hay varias maneras, se pueden seleccionar los elementos de la lista o convertir esta a un DataFrame y utilizar los métodos iloc o loc.
Jordi dice
Hola, tengo una duda urgente. Estoy haciendo un proyecto con tkinter. Y cuando vuelvo a ingresar valores me los reemplaza. Como puedo hacer que se sigan añadiendo filas de valores? Muchas gracias
Daniel Rodríguez dice
Hola, eso es porque al guardar un archivo Excel sobrescribe todo el archivo. Si el problema es agregar una fila a la hoja se tiene que hacer en código y guardar todo. Por otro lado, si lo que se desea es trabajar con varias hojas hay que usar ExcelWriter como se explica en un comentario anterior o, más en detalle, en una entrada donde se explica cómo guardar diferente hojas en un libro de Excel.
felipe dice
Hola a todos
Quiera saber como puedo guardar dos dataset diferentes en un mismo excel. porque solamente se guardar un dataset:
Dataset.to_excel(“data.xlsx”)
Pero no se como puedo guardar dos dataset diferentes en un mismo excel.
Muchas gracias, saludos !
Daniel Rodríguez dice
Para trabajar guardar varios dataframes en un mismo libro se tiene que seguir unos pasos que se explica en esta otra entrada.
Julio dice
como hago para instalar pandas ?
Daniel Rodríguez dice
Se puede instalar desde PyPI con pip como la mayoría de las librerías de Python:
pip install pandas
Juan dice
Alguien a intentado poner una formula en el dataframe y al pegar la base a excel el mismo excel reconozca la formula? un consultarv por ejemplo
Daniel Rodríguez dice
Según la documentación se puede hacer con XlsxWrite (https://xlsxwriter.readthedocs.io/working_with_formulas.html), pero no lo he probado.
diego dice
hola, oye tengo una base de datos de sqlite que se carga diligenciando informacion en un programa como gaho para exportar estos datos a un excel en el momento que quiera por medio de un botom????
Julio dice
tengo un archivo excel con celdas que contienen textos de varias lineas, pero al leer el archivo con pandas , el contenido lo corta y pone puntos suspensivos….
como hacer para obtener el contenido completo de la celda con python
Daniel Rodríguez dice
Es un problema de configuración de Pandas, por defecto no se muestra todo el contenido de los DataFrames, eso es algo que explico como cambiar en esta otra entrada https://www.analyticslane.com/2021/08/26/pandas-mostrar-todos-los-elementos-de-un-dataframe/
daniela dice
hola quisiera hacer un rename de columnas de un excel que tengo en una ruta y la modificacion guardarla en otra, uso este script, me aloja ok el excel pero sin la modificacion, que estoy haciendo mal?
import openpyxl
import pandas as pd
import numpy as np
import xlsxwriter
#renombro el excel
canje = “C:/Users/EHLJV/Documents/dpereyra/Tableros/tablero customer/Argentina/python/Crudo_Encuestas/Canje_21-22_Innoba_VF.xlsx”
#creo dataframe y busco hoja
df= pd.read_excel (canje, sheet_name=’Base’, engine=’openpyxl’)
#ruta donde alojo el archivo con modificaciones
df.to_excel(‘C:/Users/EHLJV/Documents/dpereyra/Tableros/tablero customer/Argentina/USR_FILES/CSAT__Qualtrics_Canje_2021_05_13.xlsx’, sheet_name=’Hoja1′, engine =’openpyxl’)
df.rename(columns= {‘Contact Fields – Recipient Email’:’RecipientEmail’})
Daniel Rodríguez dice
Bastante sencillo, en primer lugar, se guardan los datos y luego se cambia el nombre, por eso en archivo Excel están los valores originales.
Andres Vargas dice
excelentes explicaciones Daniel. tengo una consulta:
Como puedo recorer cada registro de excel y añadir un valor a la columna inmediatamente siguiente?
ej: tengo en la columna A nombres de personas, en la columna B fechas de nacimiento, pero necesito agregar en la columna C el valor de edad de acuerdo a la comparación de la columna B con la fecha actual del Sistema…como puedo realizar la acción de recorrido y escritura… se que con una iteración..pero desconozco el método!..
Daniel Rodríguez dice
Una vez se importa un archivo de Excel lo que se tiene es un DataFrame, por lo que para agregar la columna con los datos. Puede ser algo tan sencillo como
import datetime
df['age'] = np.ceil((np.datetime64(datetime.date.today()) - pd.to_datetime(df['birthday'])) / datetime.timedelta(365))
Luis dice
Hola,
Que caracteristicas o como se guarda un archivo en EXCEL *.csv para que pandas lo levante.
Muchas veces, muuuuuuchos archivos csv no los levanta pandas y hay problemas.
Gracias.
Daniel Rodríguez dice
Pandas puede leer cualquier archivo en formato CSV, solamente hay que indicar las opciones necesarias como el separador de valores con sep https://www.analyticslane.com/2020/11/30/pandas-leer-archivos-csv-con-diferentes-delimitadores-en-pandas/