Добавление Pandas DataFrame в существующий документ Excel - PullRequest
0 голосов
/ 14 января 2019

За https://github.com/pandas-dev/pandas/pull/21251/files/09e5b456e1af5cde55f18f903ab90c761643b05a, мы сможем добавить DataFrames к новым листам XLSX.

На основании документации я попробовал следующее:

>>> import pandas as pd
>>>                
... d1 = pd.DataFrame({"A":['Bob','Joe', 'Mark'], 
...                "B":['5', '10', '20']})
>>> d2 = pd.DataFrame({"A":['Jeffrey','Ann', 'Sue'], 
...                "B":['1', '2', '3']})
>>> 
>>> # Create XLSX document for ticker
... writer = pd.ExcelWriter('test.xlsx',engine='openpyxl')
>>> d1.to_excel(writer,sheet_name='d1')
>>> writer.save()
>>> 
>>> writer = pd.ExcelWriter('test.xlsx',engine='openpyxl', mode='a')
>>> d2.to_excel(writer,sheet_name='d2')
>>> writer.save()
>>> 
>>> pd.__version__
'0.23.4'     # Just updated this per a comment
>>> 
>>> 

В результате получается одна книга с именем «test.xlsx» с одной вкладкой «d2».

Как я могу предотвратить перезапись формы книги / листа?

Ответы [ 3 ]

0 голосов
/ 14 января 2019

Я отправил сообщение на GitHub и получил ответ от участников (см. Выделенную часть ниже). Оказывается, эта функциональность не будет выпущена до 0.24, поэтому она не доступна в 0.23.1. К вашему сведению - я скачал RC и успешно опробовал mode='a' вариант. Тем не менее, может быть ошибка с книгами, которые не существуют; Я получаю FileNotFoundError: [Errno 2] No such file or directory: 'test.xlsx'.

"эта функция выпускается как часть 0.24, которую мы только что выпустили кандидатом на выпуск в течение последних нескольких дней. Вы можете примерить RC или здесь на master, и если ни одна из них не работает, откройте проблему в соответствии с руководством, вносящим вклад, но это не должно работать на версиях старше этой "

0 голосов
/ 28 февраля 2019

импорт панд как pd

writer = pd.ExcelWriter(wk_path + save_file)
# ....
# build sc_files DataFrame and save. sc_files includes
# a column called OS.

sc_file.to_excel(writer, sheet_name='test')

# build data frame of OS counts out of sc_file
counts_os = sc_file.OS.value_counts() 

# To append to 'test' sheet, use startcol=x1, startrow=y
# To append counts_OS to the end of the current 'test' sheet
y = len(sc_file)
y += 1
counts_os.to_excel(writer, sheet_name='test', 
    startcol=1, startrow=y)

# write counts_os to sheet test2 
counts_os.to_excel(writer, sheet_name='test2')
writer.save()
writer.close()
0 голосов
/ 14 января 2019

Вы можете использовать with:

with pd.ExcelWriter('test.xlsx', engine='openpyxl', mode='a') as writer:
    d1.to_excel(writer,sheet_name='d1')
    d2.to_excel(writer,sheet_name='d2')
    writer.save()

writer.close()

обновление

Это должно сработать, просто обратите внимание, что перед созданием файла необходимо создать пустой файл. Вы можете просто создать пустой файл, используя python, если хотите. Я создал простой цикл, в некотором роде имитирующий суть того, что вы пытаетесь выполнить:

import pandas as pd
from openpyxl import load_workbook

d1 = pd.DataFrame({"A":['Bob','Joe', 'Mark'], 
               "B":['5', '10', '20']})
d2 = pd.DataFrame({"A":['Jeffrey','Ann', 'Sue'], 
                "B":['1', '2', '3']})

dfs = [d1,d2]

for i in range(len(dfs)):
    sheet = 'd'+str(i+1)
    data = dfs[i]
    writer = pd.ExcelWriter('atest.xlsx',engine='openpyxl', mode='a')
    writer.book = load_workbook('atest.xlsx') # here is the difference
    data.to_excel(writer,sheet_name=sheet)
    writer.save()
    writer.close()

или вот модифицированный первый пример:

d1 = pd.DataFrame({"A":['Bob','Joe', 'Mark'], 
               "B":['5', '10', '20']})
d2 = pd.DataFrame({"A":['Jeffrey','Ann', 'Sue'], 
                "B":['1', '2', '3']})

writer = pd.ExcelWriter('atest.xlsx', engine='openpyxl', mode='w')
d1.to_excel(writer,sheet_name='d1')
writer.save()
writer.close()

writer = pd.ExcelWriter('atest.xlsx', engine='openpyxl', mode='a')
writer.book = load_workbook('atest.xlsx')
d2.to_excel(writer,sheet_name='d2')
writer.save()
writer.close()
...