web-dev-qa-db-fra.com

Comment enregistrer une nouvelle feuille dans un fichier Excel existant, à l'aide de pandas?

Je souhaite utiliser des fichiers Excel pour stocker des données élaborées avec Python. Mon problème est que je ne peux pas ajouter de feuilles à un fichier Excel existant. Ici, je suggère un exemple de code avec lequel travailler pour résoudre ce problème.

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

Ce code enregistre deux DataFrames sur deux feuilles, nommées "x1" et "x2" respectivement. Si je crée deux nouveaux DataFrames et que j'essaie d'utiliser le même code pour ajouter deux nouvelles feuilles, "x3" et "x4", les données d'origine sont perdues.

import pandas as pd
import numpy as np

path = r"C:\Users\fedel\Desktop\excelData\PhD_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 "moteur", il existe "openpyxl". J'ai aussi vu qu'il y a déjà d'autres personnes qui ont écrit sur ce sujet, mais je ne comprends toujours pas comment faire cela.

Voici un code tiré de ceci 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.title", "ws" et "dict" sont dans ce contexte.

Quel est le meilleur moyen de sauvegarder "x1" et "x2", puis fermez le fichier, rouvrez-le et ajoutez "x3" et "x4"?

45
Stefano Fedele

Je vous remercie. Je pense qu'un exemple complet pourrait être bénéfique pour quiconque ayant le même problème:

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. À ma connaissance, peu importe qu’il soit généré via le moteur "xslxwriter" ou le moteur "openpyxl".

Quand je veux écrire sans perdre les données d'origine, 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!

58
Stefano Fedele

Dans l'exemple que vous avez partagé, vous chargez le fichier existant dans book et définissez la valeur de writer.book sur book. Dans la ligne writer.sheets = dict((ws.title, ws) for ws in book.worksheets), vous accédez à chaque feuille du classeur en tant que ws. Le titre de la feuille est alors ws de sorte que vous créez un dictionnaire de {sheet_titles: sheet} clé, paires de valeurs. Ce dictionnaire est ensuite défini sur writer.sheets. Essentiellement, ces étapes ne font que charger les données existantes de 'Masterfile.xlsx' et en renseigner votre rédacteur.

Supposons maintenant que vous avez déjà un fichier avec x1 et x2 en tant que feuilles. Vous pouvez utiliser l'exemple de code pour charger le fichier, puis procéder comme suit 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()

Cela devrait faire ce que vous recherchez.

13
Grr

Un exemple simple pour écrire plusieurs données à la fois dans Excel. Et aussi lorsque vous souhaitez ajouter des données à une feuille sur un fichier Excel écrit (fichier Excel fermé).

Quand vous écrivez pour la première fois sur Excel. (Écriture de "df1" et "df2" dans "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()    

Une fois que vous fermez votre Excel, mais que vous souhaitez "ajouter" des données sur le même fichier Excel mais sur 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 au format xls, vous pouvez en utiliser un.

8
Wong Tat Yau

Je vous recommande fortement de travailler directement avec openpyxl car il supporte maintenant Pandas DataFrames .

Cela vous permet de vous concentrer sur les codes Excel et Pandas appropriés.

7
Charlie Clark

Une autre méthode assez simple consiste à créer une méthode comme celle-ci:

def _write_frame_to_new_sheet(path_to_file=None, sheet_name='sheet', data_frame=None):
    book = None
    try:
        book = load_workbook(path_to_file)
    except Exception:
        logging.debug('Creating new workbook at %s', path_to_file)
    with pd.ExcelWriter(path_to_file, engine='openpyxl') as writer:
        if book is not None:
            writer.book = book
        data_frame.to_Excel(writer, sheet_name, index=False)

L'idée ici est de charger le classeur à l'emplacement chemin_du_fichier s'il existe, puis d'ajouter le cadre data_frame en tant que nouvelle feuille avec nom_du_page. Si le classeur n'existe pas, il est créé. Il semble que ni openpyxl ni xlsxwriter append, donc comme dans l'exemple de @Stefano ci-dessus, vous devez vraiment charger, puis réécrire pour ajouter.

0
MrMajestyk

Vous pouvez lire des feuilles existantes de vos centres d'intérêt, par exemple, "x1", "x2", et les "écrire" avant d'ajouter de nouvelles feuilles (gardez à l'esprit que les feuilles d'un fichier et les feuilles de la mémoire sont deux les choses, si vous ne les lisez pas, elles seront perdues). Cette approche utilise uniquement 'xlsxwriter', aucun openpyxl n'est impliqué.

import pandas as pd
import numpy as np

path = r"C:\Users\fedel\Desktop\excelData\PhD_data.xlsx"

# begin <== read selected sheets and write them back
df1 = pd.read_Excel(path, sheet_name='x1', index_col=0) # or sheet_name=0
df2 = pd.read_Excel(path, sheet_name='x2', index_col=0) # or sheet_name=1
writer = pd.ExcelWriter(path, engine='xlsxwriter')
df1.to_Excel(writer, sheet_name='x1')
df2.to_Excel(writer, sheet_name='x2')
# end ==>

# now create more new sheets
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()

Si vous souhaitez conserver toutes les feuilles existantes, vous pouvez remplacer le code ci-dessus entre début et fin par:

# read all existing sheets and write them back
writer = pd.ExcelWriter(path, engine='xlsxwriter')
xlsx = pd.ExcelFile(path)
for sheet in xlsx.sheet_names:
    df = xlsx.parse(sheet_name=sheet, index_col=0)
    df.to_Excel(writer, sheet_name=sheet)
0
Jonathan L
#This program is to read from Excel workbook to fetch only the URL domain names and write to the existing Excel workbook in a different sheet..
#Developer - Nilesh K
import pandas as pd
from openpyxl import load_workbook #for writting to the existing workbook

df = pd.read_Excel("urlsearch_test.xlsx")

#You can use the below for the relative path.
# r"C:\Users\xyz\Desktop\Python\

l = [] #To make a list in for loop

#begin
#loop starts here for fetching http from a string and iterate thru the entire sheet. You can have your own logic here.
for index, row in df.iterrows():
    try: 
        str = (row['TEXT']) #string to read and iterate
        y = (index)
        str_pos = str.index('http') #fetched the index position for http
        str_pos1 = str.index('/', str.index('/')+2) #fetched the second 3rd position of / starting from http
        str_op = str[str_pos:str_pos1] #Substring the domain name
        l.append(str_op) #append the list with domain names

    #Error handling to skip the error rows and continue.
    except ValueError:
            print('Error!')
print(l)
l = list(dict.fromkeys(l)) #Keep distinct values, you can comment this line to get all the values
df1 = pd.DataFrame(l,columns=['URL']) #Create dataframe using the list
#end

#Write using openpyxl so it can be written to same workbook
book = load_workbook('urlsearch_test.xlsx')
writer = pd.ExcelWriter('urlsearch_test.xlsx',engine = 'openpyxl')
writer.book = book
df1.to_Excel(writer,sheet_name = 'Sheet3')
writer.save()
writer.close()

#The below can be used to write to a different workbook without using openpyxl
#df1.to_Excel(r"C:\Users\xyz\Desktop\Python\urlsearch1_test.xlsx",index='false',sheet_name='sheet1')
0
nileshk611