Anexar info a Excel desde un DataFrame (Pandas)

Buenos días estimadxs,
Tengo un dataframe de pandas creado y quiero que la información se vaya anexando al final de un archivo Excel. La pregunta que tengo es si tienen algún código o tips, para hacer esto, ya que uso el método DataFrame.to_excel, pero me termina eliminando la información que tenía en mi excel y me crea uno nuevo con la info que le paso.
La instrucción que uso es
df.to_excel(excel_writer=archi_XLS, sheet_name=‘DATA’, startrow=fila_hasta, startcol=0, index=False, index_label=False)
donde:
df: es el dataframe de pandas con la información que quiero pasar al Excel.
archi_XLS: nombre del archivo
DATA: nombre de la hoja donde quiero que quede la info
fila_hasta: primer fila en blanco que tiene mi archivo (para anexar la información a partir de ahí

Como dije, en general la información al Excel se pasa, solo que en lugar de anexarlo al final del mismo, me elimina todo lo que tenía y me deja solo lo que yo estoy enviando.
Desde ya muchas gracias por cualquier ayuda que puedan darme.
Gustavo

Por sí a alguno le sirve, dejo la solución que encontré.
básicamente se resume a:
pip install pandas as pd
pip install openpyxl

#Abrir el archivo
wb = openpyxl.load_workbook(archi_XLS)
#Posicionarse en la hoja
hoja = wb[‘DATA’]
#Acá está lo importante y es pasar el DataFrame a un arreglo de tuplas
productos = [tuple(x) for x in df.values]
#Iteramos en las tuplas anteriores para ir agregando los registros ‘de a 1’
for producto in productos:
hoja.append(producto)

Espero pueda ayudar a alguno

@gfellay Se me ocurre que iterar fila por fila es un consumo de memoria muy grande.
Por qué no levantar el excel en un DF, luego concatenar el nuevo DF y guardar reemplazando el excel
primero.

import pandas as pd

fila_hasta = 1

df_excel = pd.read_excel(archi_XLS, sheet_name=‘DATA’, header=2)

df = "ACA VA EL DATAFRAME QUE ARMES"

df_concat = pd.concat([df_excel, df])

df_concat.to_excel(excel_writer=archi_XLS, sheet_name=‘DATA’, startrow=fila_hasta, startcol=0, index=False, index_label=False)

Después otra cosa que noto es que no es un excel, sino un XLS, cosa que falla la lectura. En este caso recomiendo que lo guardes como XLSX y utilices este formato ya que las librería de openpyxl suele fallar.

Saludos

Gracias @liberse lo voy a tener en cuenta.
Igualmente creo que la forma en que lo tengo no es ‘tan’ mala, ya que por día solo tengo unos 100 registros (que es lo que voy a agregar) mientras que si levanto todo el excel puedo tener varios miles y en ese caso ya no estoy tan seguro que convenga traer todos los datos, para agregar 100 registros y volverlo a guardar.
Respecto al archivo es cierto, en realidad yo le puse XLS al nombre de la variable, pero el archivo en sí es un xlsx
Muchas gracias por tu respuesta!

@liberse me quedé pensando en tu solución y creo que está muy interesante, pero cuando la estaba tratando de aplicar me ocurrió algo que no sé si sabrás como solucionarlo.
Yo inicialmente tengo dos hojas en el archivo y por ese lado tomando tu solución no veo problemas, ya que creé el XLSX agregando las dos hojas a partir de dos dataframes que tengo. Incluso le pude poner formatos, autofiltros y otras opciones, pero no encontré la forma de proteger ciertas celdas de la hoja para que no puedan ser modificadas.
En concreto la pregunta es: sabés como hacer para que de una hoja, un cierto rango quede bloquedado para modificar, pero otro no? Ya que si pude proteger la hoja, pero esto me bloqueda toda la hoja y no encontré la forma desde Python de desbloquear un cierto rango dado.
Muchas gracias por cualquier pista que puedas proporcionarme.

Por si a alguien le sirve, dejo el código para bloquear/desbloquear un cierto rango de celdas de una hoja protegida (lo obtuve con Copilot y luego de depurarlo un poco, puedo decir que funciona).

from openpyxl import load_workbook
from openpyxl.styles import Protection

Carga tu archivo de Excel

wb = load_workbook(‘tu_archivo.xlsx’)

Selecciona la hoja que quieres proteger

ws = wb[‘nombre_de_tu_hoja’]

Desbloquea un rango específico de celdas (por ejemplo, ‘A1:B10’)

for cell in ws[‘A1:B10’]:
…for c in cell:
… …c.protection = Protection(locked=False)

Activa el autofiltro

ws.auto_filter.ref = ws.dimensions

Protege la hoja con una contraseña

ws.protection.set_password(‘tu_contraseña’)

Guarda el archivo de Excel

wb.save(‘tu_archivo.xlsx’)

Perdón por lo puntos suspensivos, pero no sé como formatear este texto para que me respete las tabulaciones.