Comment sauvegarder une nouvelle feuille dans un fichier excel existant, en utilisant Pandas?

je veux utiliser des fichiers excel pour stocker des données élaborées avec python. Mon problème est que je ne peux pas ajouter des feuilles à un fichier excel existant. Je propose ici un exemple de code à utiliser pour parvenir à ce résultat

import pandas as pd
import numpy as np

path = r"C:UsersfedelDesktopexcelDataPhD_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()

ce code sauve deux images de données à deux feuilles, nommées respectivement" x1 "et" x2". Si j'ai créer deux nouveaux DataFrames et essayez d'utiliser le même code pour ajouter deux nouvelles feuilles, 'x3' et 'x4', les données d'origine est perdue.

import pandas as pd
import numpy as np

path = r"C:UsersfedelDesktopexcelDataPhD_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()

je veux un fichier excel avec quatre feuilles: 'x1', 'x2', 'x3', 'x4'. Je sais que' xlsxwriter 'n'est pas le seul "engine", il y a'openpyxl'. J'ai aussi vu qu'il y a déjà d'autres personnes qui ont écrit sur cette question, mais je ne peux pas comprendre comment le faire.

ici un code tiré de ce lien

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()

Ils disent que cela fonctionne, mais il est difficile de comprendre comment. Je ne comprends pas ce que "ws.intitulé", "ws", et "dict" sont dans ce contexte.

Quelle est la meilleure façon de sauvegarder "x1" et "x2", puis fermer le fichier, l'ouvrir à nouveau et ajouter "x3" et "x4"?

23
demandé sur Community 2017-02-21 18:07:04

4 réponses

Merci. Je crois qu'un exemple pourrait être bon pour quelqu'un d'autre avez quelques question:

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()

ici, je génère un fichier excel, d'après ce que j'ai compris, peu importe qu'il soit généré via le moteur "xslxwriter" ou "openpyxl".

quand je veux écrire sans perdre les données originales alors

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.save()
writer.close()

ce code fait le travail!

25
répondu Stefano Fedele 2017-02-21 18:34:12

Dans l'exemple que vous avez partagé vous chargez le fichier existant dans book et le writer.book valeur book . À la ligne writer.sheets = dict((ws.title, ws) for ws in book.worksheets) , vous accédez à chaque feuille du classeur sous la rubrique ws . Le titre de la feuille est alors ws donc vous créez un dictionnaire de {sheet_titles: sheet} clé, paires de valeurs. Ce dictionnaire est alors définie à l'écrivain.feuille. essentiellement, ces étapes ne font que charger les données existantes de 'Masterfile.xlsx' et peupler votre écrivain avec eux.

maintenant, disons que vous avez déjà un fichier avec x1 et x2 comme feuilles. Vous pouvez utiliser le code d'exemple pour charger le fichier et puis faire quelque chose comme ça pour ajouter x3 et x4 .

path = r"C:\Users\fedel\Desktop\excelData\PhD_data.xlsx"
writer = pd.ExcelWriter(path, engine='openpyxl')
df3.to_excel(writer, 'x3', index=False)
df4.to_excel(writer, 'x4', index=False)
writer.save()

Qui devrait faire ce que vous cherchez.

13
répondu Grr 2017-12-07 20:06:19

je vous recommande fortement de travailler directement avec openpyxl car il supporte désormais Pandas DataFrames .

cela vous permet de vous concentrer sur le Code Excel et Pandas pertinents.

6
répondu Charlie Clark 2017-02-21 16:28:16

un exemple simple pour écrire plusieurs données pour exceller à la fois. Et aussi quand vous voulez ajouter des données à une feuille sur un fichier excel écrit (fichier excel fermé).

quand c'est la première fois que vous écrivez à un excel. (L'écriture "df1" et "df2" à "1st_sheet" et "2nd_sheet")

import pandas as pd 
from openpyxl import load_workbook

df1 = pd.DataFrame([[1],[1]], columns=['a'])
df2 = pd.DataFrame([[2],[2]], columns=['b'])
df3 = pd.DataFrame([[3],[3]], columns=['c'])

excel_dir = "my/excel/dir"

with pd.ExcelWriter(excel_dir, engine='xlsxwriter') as writer:    
    df1.to_excel(writer, '1st_sheet')   
    df2.to_excel(writer, '2nd_sheet')   
    writer.save()    

après avoir fermé votre excel, mais vous souhaitez "ajouter" des données sur le même fichier excel mais une autre feuille, disons "df3 "au nom de la feuille"3rd_sheet".

book = load_workbook(excel_dir)
with pd.ExcelWriter(excel_dir, engine='openpyxl') as writer:
    writer.book = book
    writer.sheets = dict((ws.title, ws) for ws in book.worksheets)    

    ## Your dataframe to append. 
    df3.to_excel(writer, '3rd_sheet')  

    writer.save()     

notez que le format excel ne doit pas être xls, vous pouvez utiliser xlsx one.

6
répondu WONG TAT YAU 2018-01-05 10:40:10