¿Cómo guardar una nueva hoja en un archivo de Excel existente, usando Pandas?

Resuelto Stefano Fedele asked hace 7 años • 14 respuestas

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 con el que trabajar para solucionar 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, denominadas "x1" y "x2" respectivamente. Si creo dos nuevos DataFrames e intento 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 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 todavía 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"?

Stefano Fedele avatar Feb 21 '17 22:02 Stefano Fedele
Aceptado

Gracias. Creo que un ejemplo completo podría ser bueno para cualquiera 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.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.close()

¡Este código hace el trabajo!

Stefano Fedele avatar Feb 21 '2017 18:02 Stefano Fedele

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 .

Pulkit Khandelwal avatar Sep 01 '2020 17:09 Pulkit Khandelwal