Pandas Daten im gleichen Sheet anhängen

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Bl3nder
User
Beiträge: 139
Registriert: Freitag 3. Januar 2020, 17:07

Schönen guten Tag Ich habe folgendes Problem Ich lese mit hilfe von Pandas ein Excel Datei aus und möchte Sie horizontal wieder in eine andere Excel Datei schreiben....


Code: Alles auswählen

import openpyxl
import os.path
import time
import pandas as pd
from decimal import *
 
 
 
def Datenbank():
     df = pd.read_excel(r"C:\Users\Marcel\Desktop\Klimareport Test Ordner\Aktuell.1.xlsx","Statistik C",header=None,)
 
     Test = len(df.index.values)
     df.dropna(how="all")
     df = df.iloc[3]
     Data = pd.DataFrame(df)
 
 
     with pd.ExcelWriter(r"C:\Users\Marcel\Desktop\Klimareport Test Ordner\Test.xlsx",engine="openpyxl",mode="a")as writer:
         Data.T.to_excel(writer,header=None, index=None, startrow=Test, startcol=2)
 
 
 
 
Datenbank()


Leider bekomme Ich es nicht ganz der Code funktioniert soweit nur Ich möchte das immer wieder in das gleiche "Sheet" geschrieben wird jedoch wird immer ein neues erzeugt und Ich möchte das die Daten nicht überschrieben werden.Kann mir jemand eine kleine Hilfestellung geben ?

Vielen dank im Voraus!
Eine Vision ohne Aktion bleibe eine Illusion
Bl3nder
User
Beiträge: 139
Registriert: Freitag 3. Januar 2020, 17:07

Ich habe es mithilfe von anderen Anleitungen und Tipps nun hinbekommen falls jemand genau das gleiche Problem hat:

Code: Alles auswählen

def Datenbank():


     writer = pd.ExcelWriter(r"C:\Users\Marcel\Desktop\Klimareport Test Ordner\Test.xlsx",engine="openpyxl")
     writer.book = openpyxl.load_workbook(r"C:\Users\Marcel\Desktop\Klimareport Test Ordner\Test.xlsx")
     writer.sheets = dict((ws.title,ws)for ws in writer.book)
     df = pd.read_excel(r"C:\Users\Marcel\Desktop\Klimareport Test Ordner\Aktuell.1.xlsx","Statistik C",header=None,)
     Test = len(df.index.values)
     Test = Test +1
     df.dropna(how="all")
     df = df.iloc[3]
     Data = pd.DataFrame(df)
     Data.T.to_excel(writer, header=None, index=None, startrow=Test, startcol=2)

     writer.close()




Datenbank()
Eine Vision ohne Aktion bleibe eine Illusion
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Bl3nder: `Datenbank()` ist kein sinnvoller Funktionsname. Per Kovention muss der sowieso klein_mit_unterstrichen sein, wie alles ausser Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase). Und er sollte die Tätigkeit beschreiben, die die Funktion durch führt. `Datenbank` ist keine Tätigkeit.

Daten wie die Dateinamen sollte man als Konstanten definieren und den gemeinsamen Präfix am besten auch dort heraus ziehen.

`ExcelWriter` kennt für das erstellen ein `mode`-Argument das `a` für „append“ sein kann. Damit muss man die Daten nicht selbst in das `book`-Attribut laden.

Den Hack mit dem `sheets`-Attribut sollte man auf jeden Fall dokumentieren, damit niemand a) auf die Idee "openpyxl" als `engine` zu ändern, und man b) gleich weiss wo man mit suchen anfangen kann, falls das mal nicht mehr funktioniert weil sich die Implementierung geändert hat, und es das nicht-öffentliche `sheet`-Attribut nicht mehr gibt.

Warum ``len(df.index.values)`` statt einfach ``len(df)``? `test` ist auch ein sehr unpassender Name an der Stelle.

Das verpacken des `Series`-Objekts in einen neuen `DataFrame` und Transponieren vorm schreiben kann man sich sparen wenn man die Zeile gleich als einen `DataFrame` selektiert den man direkt schreiben kann.

`ExcepWriter`-Objekte sind Kontextmanager und können und sollten mit ``with`` verwendet werden.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
from pathlib import Path

import pandas as pd

BASE_PATH = Path("C:/Users/Marcel/Desktop/Klimareport Test Ordner")
TEST_EXCEL_FILE_PATH = BASE_PATH / "Test.xlsx"
NEW_DATA_EXCEL_FILE_PATH = BASE_PATH / "Aktuell.1.xlsx"
NEW_DATA_EXCEL_SHEET_NAME = "Statistik C"


def extend_excel_sheet():
    #
    # Attention: This is a hack to append data to an existing sheet.  It works
    #   with the "openpyxl" engine as long as that uses the non public `sheets`
    #   attribute so this hack works.
    #
    with pd.ExcelWriter(
        TEST_EXCEL_FILE_PATH, engine="openpyxl", mode="a"
    ) as writer:
        writer.sheets = {sheet.title: sheet for sheet in writer.book}

        data = pd.read_excel(
            NEW_DATA_EXCEL_FILE_PATH, NEW_DATA_EXCEL_SHEET_NAME, header=None
        )
        data.dropna(how="all").iloc[[3]].to_excel(
            writer, header=None, index=None, startrow=len(data) + 1, startcol=2
        )


if __name__ == "__main__":
    extend_excel_sheet()
Ist eigentlich garantiert, dass es nach dem filtern der NaN-Zeilen Daten in Zeile 4 gibt? Falls nicht, ist das eine potentielle Fehlerquelle.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Bl3nder
User
Beiträge: 139
Registriert: Freitag 3. Januar 2020, 17:07

Ich danke dir das von dir geschrieben funktioniert exat genau so wie meine Variante jedoch wie oben zu sehen habe Ich es erst mit dem append mode versucht und with und es hat nicht zu dem Ergbenis geführt das Ich mir erhofft habe , Ich bin halt ein Anfänger.Es sollte kein fertiges Ergbenis sein sondern einfach ein grober Entwurf führ Leute die ebenfalls Schwierigkeiten haben.Ich bedanke mich trotzdem bei dir :)
Eine Vision ohne Aktion bleibe eine Illusion
Antworten