Из коробки решения нет не для одной из твоих проблем. Ему нужен индекс, для того что бы сохранять иерархическую структуру.
Можно ли это обойти, ну в программировании можно много чего обойти, вопрос а НУЖНО ли это, так или иначе, если хочется НЕНУЖНЫХ изобретений, то можно разбить проблему на две части отдельно писать иерархический header, отдельно данные, чего я бы на практике я не делал (чревато тем что, таблица "сдвинется куда нибудь") и вот тогда действительно проблематично.
Удалить только пропущенную строку можно "относительно" безопасно.
def write(df, xl_writer, startrow = 0,**kwargs):
df.drop(df.index).to_excel(xl_writer, startrow = startrow,**kwargs)
df.to_excel(xl_writer, startrow = startrow + 1,header = False,**kwargs)
writer = pd.ExcelWriter("test_only_removed_empty_row.xlsx",engine='xlsxwriter')
write(df, writer, sheet_name = 'Лист1')
writer.close()
Это более менее безопасно, удаление индекса все еще возможно, но приходится начинать ловить сдвиги, для общего случая ТАК ДЕЛАТЬ НЕЛЬЗЯ. Так или иначе, ужасная функция которая сделает это вот
def write(df, xl_writer, startrow = 0,startcol=0,**kwargs):
df.drop(df.index).to_excel(xl_writer, startrow = startrow,startcol=startcol,**kwargs)
df.droplevel(0,axis=1).to_excel(xl_writer, startrow = startrow + 2, startcol=startcol+1,header = False,index=False,**kwargs)
writer = pd.ExcelWriter("bad_practice.xlsx",engine='xlsxwriter')
write(df, writer, sheet_name = 'Лист1')
writer.close()
Ну и в завершение, повторюсь, написание иерархических колонок, без индекса (index=False). Попросту выдает ошибку NotImplemented (Это не поддерживается текущим API). А вот такие "решения", как я продемонстрировал сомнительны. И да возможно, если не уставлен, придется установить xlsxwriter, или убрать параметр engine, что бы он использовал свой, там openpyxl по умолчанию стоит.