wake-up-neo.com

Viele Python-Pandas-Datenrahmen in ein Excel-Arbeitsblatt einfügen

Es ist ziemlich einfach, viele Pandas-Datenframes in das Excel-Arbeitsbuch aufzunehmen, sofern es sich um unterschiedliche Arbeitsblätter handelt. Es ist jedoch etwas kompliziert, viele Datenframes in ein Arbeitsblatt zu integrieren, wenn Sie die eingebaute df.to_Excel-Funktionalität von Pandas verwenden möchten. 

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

Der obige Code funktioniert nicht. Sie erhalten den Fehler von 

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

Jetzt habe ich genug experimentiert, um einen Weg zu finden, damit es funktioniert. 

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) 

Das wird funktionieren. Ich habe also ein zweifaches Ziel, diese Frage auf stackoverflow zu stellen. Erstens hoffe ich, dass dies jemandem helfen wird, wenn er/sie versucht, viele Datenframes in ein einziges Arbeitsblatt bei Excel zu packen. 

Zweitens: Kann mir jemand helfen, den Unterschied zwischen diesen beiden Codeblöcken zu verstehen? Es scheint mir, dass sie ziemlich gleich sind, mit Ausnahme des ersten erstellten Arbeitsblocks namens "Validation" im Voraus, während der zweite nicht funktioniert. Ich bekomme diesen Teil. 

Was ich nicht verstehe ist warum sollte es anders sein? Auch wenn ich das Arbeitsblatt nicht im Voraus erstelle, wird diese Zeile vor der letzten Zeile angezeigt. 

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

wird trotzdem ein Arbeitsblatt erstellen. Daher ist das Arbeitsblatt "Validation" beim Erreichen der letzten Codezeile bereits im zweiten Codeblock erstellt. Meine Frage im Grunde, warum sollte der zweite Codeblock funktionieren, während der erste nicht funktioniert? 

Bitte teilen Sie auch, wenn es eine andere Möglichkeit gibt, viele Datenframes mit der integrierten Funktion df.to_Excel in Excel einzufügen !! 

25
user3817518

Um das Arbeitsblatt im Voraus zu erstellen, müssen Sie das erstellte Arbeitsblatt der Variable sheets hinzufügen:

writer.sheets['Validation'] = worksheet

Verwenden Sie Ihren Originalcode:

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

Erläuterung

Wenn wir uns die Pandas-Funktion to_Excel anschauen, verwendet sie die write_cells-Funktion des Schreibers: 

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

Schauen Sie sich die write_cells-Funktion für xlsxwriter an:

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

Hier können wir sehen, dass in sheet_name nach self.sheets gesucht wird und daher auch dort hinzugefügt werden muss.

16
Adrian

user3817518: "Bitte teilen Sie es auch, wenn es eine andere Möglichkeit gibt, viele Datenrahmen mit der integrierten Funktion df.to_Excel in Excel einzufügen !!"

Hier ist mein Versuch:

Einfache Möglichkeit, viele Datenrahmen auf nur einem Blatt oder auf mehreren Registerkarten zusammenzustellen. Lass es mich wissen, wenn das funktioniert!

- Zum Testen führen Sie einfach die Beispiel-Datenframes und den zweiten und dritten Teil des Codes aus.

Beispiel-Datenrahmen

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

Fügen Sie mehrere Datenframes in ein xlsx-Blatt ein

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

Platzieren Sie mehrere Datenrahmen auf separaten Registerkarten/Blättern

# 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

Ich wäre eher geneigt, die Datenrahmen zuerst zu verketten und dann diesen Datenrahmen in ein Excel-Format umzuwandeln. Gehen Sie folgendermaßen vor, um zwei Datenrahmen nebeneinander (im Gegensatz zu einem übereinander) zusammenzufügen:

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