Quiero usar archivos de excel para almacenar datos elaborados con python. Mi problema es que no puedo agregar hojas a un archivo de Excel existente. Aquí sugiero un código de muestra para trabajar con el fin de llegar a este problema
import pandas as pd import numpy as np path = r"C:\Users\fedel\Desktop\excelData\PhD_data.xlsx" x1 = np.random.randn(100, 2) df1 = pd.DataFrame(x1) x2 = np.random.randn(100, 2) df2 = pd.DataFrame(x2) writer = pd.ExcelWriter(path, engine = 'xlsxwriter') df1.to_excel(writer, sheet_name = 'x1') df2.to_excel(writer, sheet_name = 'x2') writer.save() writer.close()Este código guarda dos DataFrames en dos hojas, llamadas "x1" y "x2" respectivamente. Si creo dos nuevos DataFrames y trato de usar el mismo código para agregar dos hojas nuevas, 'x3' y 'x4', los datos originales se pierden.
import pandas as pd import numpy as np path = r"C:\Users\fedel\Desktop\excelData\PhD_data.xlsx" x3 = np.random.randn(100, 2) df3 = pd.DataFrame(x3) x4 = np.random.randn(100, 2) df4 = pd.DataFrame(x4) writer = pd.ExcelWriter(path, engine = 'xlsxwriter') df3.to_excel(writer, sheet_name = 'x3') df4.to_excel(writer, sheet_name = 'x4') writer.save() writer.close()Quiero un archivo de Excel con cuatro hojas: 'x1', 'x2', 'x3', 'x4'. Sé que 'xlsxwriter' no es el único "motor", existe 'openpyxl'. También vi que ya hay otras personas que han escrito sobre este tema, pero aún no puedo entender cómo hacerlo.
Aquí un código tomado de este enlace
import pandas from openpyxl import load_workbook book = load_workbook('Masterfile.xlsx') writer = pandas.ExcelWriter('Masterfile.xlsx', engine='openpyxl') writer.book = book writer.sheets = dict((ws.title, ws) for ws in book.worksheets) data_filtered.to_excel(writer, "Main", cols=['Diff1', 'Diff2']) writer.save()Dicen que funciona, pero es difícil saber cómo. No entiendo qué son "ws.title", "ws" y "dict" en este contexto.
¿Cuál es la mejor manera de guardar "x1" y "x2", luego cerrar el archivo, abrirlo nuevamente y agregar "x3" y "x4"?
Gracias. Creo que un ejemplo completo podría ser bueno para cualquier otra persona que tenga el mismo problema:
import pandas as pd import numpy as np path = r"C:\Users\fedel\Desktop\excelData\PhD_data.xlsx" x1 = np.random.randn(100, 2) df1 = pd.DataFrame(x1) x2 = np.random.randn(100, 2) df2 = pd.DataFrame(x2) writer = pd.ExcelWriter(path, engine = 'xlsxwriter') df1.to_excel(writer, sheet_name = 'x1') df2.to_excel(writer, sheet_name = 'x2') writer.save() writer.close()Aquí genero un archivo de Excel, según tengo entendido, realmente no importa si se genera a través del motor "xslxwriter" o "openpyxl".
Cuando quiero escribir sin perder los datos originales entonces
import pandas as pd import numpy as np from openpyxl import load_workbook path = r"C:\Users\fedel\Desktop\excelData\PhD_data.xlsx" book = load_workbook(path) writer = pd.ExcelWriter(path, engine = 'openpyxl') writer.book = book x3 = np.random.randn(100, 2) df3 = pd.DataFrame(x3) x4 = np.random.randn(100, 2) df4 = pd.DataFrame(x4) df3.to_excel(writer, sheet_name = 'x3') df4.to_excel(writer, sheet_name = 'x4') writer.save() writer.close()¡Este código hace el trabajo!
En el ejemplo que compartió, está cargando el archivo existente en el book y configurando el valor de writer.book para que sea book . En la línea writer.sheets = dict((ws.title, ws) for ws in book.worksheets) está accediendo a cada hoja del libro de trabajo como ws . El título de la hoja es entonces ws , por lo que está creando un diccionario de {sheet_titles: sheet} clave, pares de valores. Luego, este diccionario se establece en escritor.hojas. Esencialmente, estos pasos son solo cargar los datos existentes de 'Masterfile.xlsx' y completar su escritor con ellos.
Ahora supongamos que ya tiene un archivo con x1 y x2 como hojas. Puede usar el código de ejemplo para cargar el archivo y luego podría hacer algo como esto para agregar x3 y x4 .
path = r"C:\Users\fedel\Desktop\excelData\PhD_data.xlsx" writer = pd.ExcelWriter(path, engine='openpyxl') df3.to_excel(writer, 'x3', index=False) df4.to_excel(writer, 'x4', index=False) writer.save()Eso debería hacer lo que estás buscando.
Para crear un nuevo archivo
x1 = np.random.randn(100, 2) df1 = pd.DataFrame(x1) with pd.ExcelWriter('sample.xlsx') as writer: df1.to_excel(writer, sheet_name='x1') Para agregar al archivo, use el argumento mode='a' en pd.ExcelWriter .
x2 = np.random.randn(100, 2) df2 = pd.DataFrame(x2) with pd.ExcelWriter('sample.xlsx', engine='openpyxl', mode='a') as writer: df2.to_excel(writer, sheet_name='x2') El valor predeterminado es mode ='w' . Ver documentación .