Par https://github.com/pandas-dev/pandas/pull/21251/files/09e5b456e1af5cde55f18f903ab90c761643b05a , nous devrions pouvoir ajouter des DataFrames à de nouvelles feuilles XLSX.
Sur la base de la documentation, j'ai essayé ce qui suit:
>>> 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
>>>
>>>
Le résultat est un seul classeur nommé 'test.xlsx' avec un seul onglet 'd2'.
Comment empêcher l'écrasement du formulaire classeur/feuille?
Vous pouvez utiliser 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()
Cela devrait fonctionner, notez simplement qu'un fichier vierge doit être créé au préalable. Vous pouvez simplement créer un fichier vide en utilisant python si vous voulez. J'ai créé une boucle simple pour, d'une certaine manière, imiter l'essence de ce que vous essayez d'accomplir:
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()
ou voici le premier exemple modifié:
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()
J'ai soumis un post sur GitHub et reçu une réponse des contributeurs (voir la partie en surbrillance ci-dessous). Il s'avère que cette fonctionnalité ne sera pas publiée avant le 0.24
donc il n'est pas disponible dans 0.23.1
. Pour info - j'ai téléchargé le RC et essayé avec succès le mode='a'
option. Cependant, il peut y avoir un bogue avec des classeurs qui n'existent pas; Je reçois FileNotFoundError: [Errno 2] No such file or directory: 'test.xlsx'
.
"Cette fonctionnalité est en cours de sortie dans le cadre de la version 0.24 pour laquelle nous venons de publier une version candidate au cours des derniers jours. Vous pouvez essayer sur le RC ou ici sur master et si aucun des deux travaux n'ouvre un problème selon le guide de contribution, mais cela ne fonctionnerait pas" t devrait fonctionner sur des versions plus anciennes que cela "
import pandas as 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()