web-dev-qa-db-fra.com

Placement de nombreux cadres de données de pandas python dans une feuille de calcul Excel

Il est assez facile d’ajouter de nombreux cadres de données sur les pandas dans un classeur Excel à condition qu’il s’agisse de feuilles de calcul différentes. Cependant, il est quelque peu délicat de regrouper plusieurs images dans une seule feuille de calcul si vous souhaitez utiliser les fonctionnalités intégrées de pandas dans df.to_Excel. 

# Creating Excel Writer Object from Pandas  
writer = pd.ExcelWriter('test.xlsx',engine='xlsxwriter')   
workbook=writer.book
worksheet=workbook.add_worksheet('Validation') 
df.to_Excel(writer,sheet_name='Validation',startrow=0 , startcol=0)   
another_df.to_Excel(writer,sheet_name='Validation',startrow=20, startcol=0) 

Le code ci-dessus ne fonctionnera pas. Vous obtiendrez l'erreur de 

 Sheetname 'Validation', with case ignored, is already in use.

Maintenant, j'ai suffisamment expérimenté pour trouver un moyen de le faire fonctionner. 

writer = pd.ExcelWriter('test.xlsx',engine='xlsxwriter')   # Creating Excel Writer Object from Pandas  
workbook=writer.book
df.to_Excel(writer,sheet_name='Validation',startrow=0 , startcol=0)   
another_df.to_Excel(writer,sheet_name='Validation',startrow=20, startcol=0) 

Cela fonctionnera. Donc, le but de poster cette question sur stackoverflow est double. Premièrement, j'espère que cela aidera quelqu'un s'il/elle tente de mettre plusieurs images dans une seule feuille de travail chez Excel. 

Deuxièmement, quelqu'un peut-il m'aider à comprendre la différence entre ces deux blocs de code? Il me semble qu’elles sont à peu près les mêmes, à l’exception du premier bloc de feuille de calcul créé par code appelé "Validation" à l’avance, contrairement au second. Je comprends cette partie. 

Ce que je ne comprends pas, c'est pourquoi cela devrait-il être différent? Même si je ne crée pas la feuille de calcul à l'avance, cette ligne, la ligne juste avant la dernière, 

 df.to_Excel(writer,sheet_name='Validation',startrow=0 , startcol=0)  

créera quand même une feuille de travail. Par conséquent, au moment où nous avons atteint la dernière ligne de code, la feuille de calcul "Validation" est déjà créée dans le deuxième bloc de code. Donc, ma question est la suivante: pourquoi le deuxième bloc de code devrait-il fonctionner alors que le premier ne fonctionne pas? 

Indiquez également s'il existe un autre moyen de mettre de nombreuses images dans Excel en utilisant la fonctionnalité intégrée df.to_Excel !! 

25
user3817518

Pour créer la feuille de calcul à l'avance, vous devez ajouter la feuille créée à la variable sheets:

writer.sheets['Validation'] = worksheet

En utilisant votre code original:

# Creating Excel Writer Object from Pandas  
writer = pd.ExcelWriter('test.xlsx',engine='xlsxwriter')   
workbook=writer.book
worksheet=workbook.add_worksheet('Validation')
writer.sheets['Validation'] = worksheet
df.to_Excel(writer,sheet_name='Validation',startrow=0 , startcol=0)   
another_df.to_Excel(writer,sheet_name='Validation',startrow=20, startcol=0) 

Explication

Si nous regardons la fonction to_Excel de pandas, elle utilise la fonction write_cells du rédacteur: 

Excel_writer.write_cells(formatted_cells, sheet_name, startrow=startrow, startcol=startcol)

Donc, en regardant la fonction write_cells pour xlsxwriter:

def write_cells(self, cells, sheet_name=None, startrow=0, startcol=0):
    # Write the frame cells using xlsxwriter.
    sheet_name = self._get_sheet_name(sheet_name)
    if sheet_name in self.sheets:
        wks = self.sheets[sheet_name]
    else:
        wks = self.book.add_worksheet(sheet_name)
        self.sheets[sheet_name] = wks

Nous pouvons voir ici qu’il vérifie sheet_name dans self.sheets et qu’il doit donc être ajouté là aussi.

16
Adrian

user3817518: "S'il vous plaît, partagez également s'il existe un autre moyen de mettre de nombreuses images dans Excel en utilisant la fonctionnalité intégrée df.to_Excel !!"

Voici ma tentative:

Un moyen facile de rassembler un grand nombre de cadres de données sur une seule feuille ou sur plusieurs onglets. Laissez-moi savoir si cela fonctionne!

- Pour tester, il suffit d'exécuter les exemples de cadres de données et les deuxième et troisième portions de code.

Exemples de cadres de données

import pandas as pd
import numpy as np

# Sample dataframes    
randn = np.random.randn
df = pd.DataFrame(randn(15, 20))
df1 = pd.DataFrame(randn(10, 5))
df2 = pd.DataFrame(randn(5, 10))

Placez plusieurs images dans une seule feuille xlsx

# funtion
def multiple_dfs(df_list, sheets, file_name, spaces):
    writer = pd.ExcelWriter(file_name,engine='xlsxwriter')   
    row = 0
    for dataframe in df_list:
        dataframe.to_Excel(writer,sheet_name=sheets,startrow=row , startcol=0)   
        row = row + len(dataframe.index) + spaces + 1
    writer.save()

# list of dataframes
dfs = [df,df1,df2]

# run function
multiple_dfs(dfs, 'Validation', 'test1.xlsx', 1)

Placez plusieurs images dans des onglets/feuilles distincts

# function
def dfs_tabs(df_list, sheet_list, file_name):
    writer = pd.ExcelWriter(file_name,engine='xlsxwriter')   
    for dataframe, sheet in Zip(df_list, sheet_list):
        dataframe.to_Excel(writer, sheet_name=sheet, startrow=0 , startcol=0)   
    writer.save()

# list of dataframes and sheet names
dfs = [df, df1, df2]
sheets = ['df','df1','df2']    

# run function
dfs_tabs(dfs, sheets, 'multi-test.xlsx')
20
TomDobbs

Je serais plus enclin à concaténer les cadres de données d'abord, puis à transformer ce cadre de données en un format Excel. Pour associer deux cadres de données (plutôt que l'un au-dessus de l'autre), procédez comme suit:

writer = pd.ExcelWriter('test.xlsx',engine='xlsxwriter')   # Creating Excel Writer Object from Pandas  
workbook=writer.book
df.to_Excel(writer,sheet_name='Validation',startrow=0 , startcol=0)   
new_df = pd.concat([df, another_df], axis=1)
new_df.to_Excel(writer,sheet_name='Validation',startrow=0 , startcol=0)   
0
Alex