wake-up-neo.com

datenrahmen mit Pandas an Excel anhängen

Ich möchte Dataframe an Excel anhängen

Dieser Code funktioniert fast wie gewünscht. Es hängt jedoch nicht jedes Mal an. Ich führe es aus und es setzt Datenrahmen in Excel. Aber jedes Mal, wenn ich es ausführen, hängt es nicht an. Ich höre auch, dass openpyxl CPU-intensiv ist, aber nicht von vielen Workarounds hört.

import pandas
from openpyxl import load_workbook

book = load_workbook('C:\\OCC.xlsx')
writer = pandas.ExcelWriter('C:\\OCC.xlsx', engine='openpyxl')
writer.book = book
writer.sheets = dict((ws.title, ws) for ws in book.worksheets)

df1.to_Excel(writer, index = False)

writer.save()

Ich möchte, dass die Daten bei jeder Ausführung angehängt werden. Dies geschieht nicht.

Datenausgabe sieht aus wie Originaldaten:

A   B   C
H   H   H

Ich will ein zweites Mal nachlaufen

A   B    C
H   H    H
H   H    H

Entschuldigung, wenn dies offensichtlich ist, bin ich neu in Python und Beispiele, die ich praktiziere, funktionierten nicht wie gewünscht.

Die Frage ist - wie kann ich bei jeder Ausführung Daten anhängen? Ich versuche zu xlsxwriter zu wechseln, aber AttributeError: 'Workbook' object has no attribute 'add_format'

5
user9079010

zunächst ist dieser Beitrag der erste Teil der Lösung, in dem Sie startrow=: angeben sollten. Vorhandene Excel-Tabelle mit neuem Datenrahmen mit Python-Pandas anhängen .

sie könnten auch header=False. in Betracht ziehen, so dass es so aussehen sollte:

df1.to_Excel(writer, startrow = 2,index = False, Header = False)

wenn Sie möchten, dass das Blatt automatisch an das Ende des Arbeitsblatts gelangt und Ihr Dokument angehängt wird, verwenden Sie:

startrow = writer.sheets['Sheet1'].max_row

und wenn Sie möchten, dass alle Blätter in der Arbeitsmappe behandelt werden:

for sheetname in writer.sheets:
    df1.to_Excel(writer,sheet_name=sheetname, startrow=writer.sheets[sheetname].max_row, index = False,header= False)

btw: für den writer.sheets könnte man das Wörterbuchverstehen verwenden (ich denke, es ist sauberer, aber das liegt an Ihnen, es erzeugt die gleiche Ausgabe):

writer.sheets = {ws.title: ws for ws in book.worksheets}

so wird der vollständige Code sein:

import pandas
from openpyxl import load_workbook

book = load_workbook('test.xlsx')
writer = pandas.ExcelWriter('test.xlsx', engine='openpyxl')
writer.book = book
writer.sheets = {ws.title: ws for ws in book.worksheets}

for sheetname in writer.sheets:
    df1.to_Excel(writer,sheet_name=sheetname, startrow=writer.sheets[sheetname].max_row, index = False,header= False)

writer.save()
10
Idan Richman

Hier ist eine Hilfsfunktion:

def append_df_to_Excel(filename, df, sheet_name='Sheet1', startrow=None,
                       truncate_sheet=False, 
                       **to_Excel_kwargs):
    """
    Append a DataFrame [df] to existing Excel file [filename]
    into [sheet_name] Sheet.
    If [filename] doesn't exist, then this function will create it.

    Parameters:
      filename : File path or existing ExcelWriter
                 (Example: '/path/to/file.xlsx')
      df : dataframe to save to workbook
      sheet_name : Name of sheet which will contain DataFrame.
                   (default: 'Sheet1')
      startrow : upper left cell row to dump data frame.
                 Per default (startrow=None) calculate the last row
                 in the existing DF and write to the next row...
      truncate_sheet : truncate (remove and recreate) [sheet_name]
                       before writing DataFrame to Excel file
      to_Excel_kwargs : arguments which will be passed to `DataFrame.to_Excel()`
                        [can be dictionary]

    Returns: None
    """
    from openpyxl import load_workbook

    # ignore [engine] parameter if it was passed
    if 'engine' in to_Excel_kwargs:
        to_Excel_kwargs.pop('engine')

    writer = pd.ExcelWriter(filename, engine='openpyxl')

    try:
        # try to open an existing workbook
        writer.book = load_workbook(filename)

        # get the last row in the existing Excel sheet
        # if it was not specified explicitly
        if startrow is None and sheet_name in writer.book.sheetnames:
            startrow = writer.book[sheet_name].max_row

        # truncate sheet
        if truncate_sheet and sheet_name in writer.book.sheetnames:
            # index of [sheet_name] sheet
            idx = writer.book.sheetnames.index(sheet_name)
            # remove [sheet_name]
            writer.book.remove(writer.book.worksheets[idx])
            # create an empty sheet [sheet_name] using old index
            writer.book.create_sheet(sheet_name, idx)

        # copy existing sheets
        writer.sheets = {ws.title:ws for ws in writer.book.worksheets}
    except FileNotFoundError:
        # file does not exist yet, we will create it
        pass

    if startrow is None:
        startrow = 0

    # write out the new sheet
    df.to_Excel(writer, sheet_name, startrow=startrow, **to_Excel_kwargs)

    # save the workbook
    writer.save()

Anwendungsbeispiele:

filename = r'C:\OCC.xlsx'

append_df_to_Excel(filename, df)

append_df_to_Excel(filename, df, header=None, index=False)

append_df_to_Excel(filename, df, sheet_name='Sheet2', index=False)

append_df_to_Excel(filename, df, sheet_name='Sheet2', index=False, startrow=25)
0
MaxU

Ich habe versucht, ein Excel-Dokument zu lesen, es in ein Dataframe zu legen und das Datenframe aus Excel mit dem gewünschten Dataframe zu verknüpfen. Es hat für mich funktioniert.

def append_df_to_Excel(df, Excel_path):
    df_Excel = pd.read_Excel(excel_path)
    result = pd.concat([df_Excel, df], ignore_index=True)
    result.to_Excel(excel_path, index=False)

df = pd.DataFrame({"a":[11,22,33], "b":[55,66,77]})
append_df_to_Excel(df, r"<path_to_dir>\<out_name>.xlsx")
0
Victor Stanescu