Pandas: DatenFrame von Funktion zurückgeben

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
antilet
User
Beiträge: 8
Registriert: Freitag 12. März 2021, 16:10

Hallo Wissende,

ich habe eine kurze Frage zu Pandas bzw. möchte ich eine Unsicherheit ausräumen.

Angenommen, ich habe eine Funktion, der ich einen Pfad übergebe, die Funktion liest die im Pfad spezifizierte Excel-Datei (bzw. ein Tabellenblatt) in einen Datenframe ein und gibt diesen zurück.
Die Rückgabe des Funktionsaufrufes speichere ich in einem Datenframe.

Wenn ich jetzt die Funktion erneut aufrufe, mit einem anderen Pfad/Excel-Tabellenblatt. Und das Rückgabeergebnis in einem anderen Datenframe speichere.
Geht das so ohne weiteres oder kommt am Ende Grütze raus, weil nicht ein Datenframe übergeben wird, sondern immer nur ein Verweis auf immer den gleichen Datenframe?

Also sowas wie:

Code: Alles auswählen

def lies_excel(filename, tabellenblatt):
    df = df = pd.read_excel(filename,
                       sheet_name = tabellenblatt,
                       engine='openpyxl') 
    return df
    
 df_1 = lies_excel(pfad1, blatt1)
 df_2 = lies_excel(pfad2, blatt2)
 
Ist am Ende noch das was ursprünglich mal im df_1 war ? Oder braucht man in so einem Fall immer ein copy(deep = True) (oder geht das auch anders?)

Für hilfreiche Antworten, vielen Dank :)
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Es ist unnötig 2x df = in die Zeile zu schreiben.
Man muss auch nicht jedes Zwischenergebnis an einen Namen binden. Wenn das eh alles ist, was in der Funktion passiert, reicht sie auch so:

Code: Alles auswählen

def lies_excel(filename, tabellenblatt):
    return pd.read_excel(filename, sheet_name = tabellenblatt, engine='openpyxl')
Wobei man sich dann fragen muss, ob sich dafür überhaupt eine Funktion lohnt.

Zu deiner Frage:
Deine Funktion gibt das zurück, was "pd.read_excel" liefert. Wenn es immer das selbe Objekt liefert, dann ist es immer das selbe Objekt. Wenn nicht, dann nicht.
Da das aber keinen Sinn macht, ist es natürlich nicht dasselbe Objekt.

Das kann man auch ziemlich einfach herausfinden: Einfach die id abrufen. Zum Beispiel im interaktiven Interpreter.

Wie du da jetzt auf copy kommst, leuchtet mir nicht ein.
antilet
User
Beiträge: 8
Registriert: Freitag 12. März 2021, 16:10

Vielen Dank für deine schnelle Antwort!
Die Funktion lohnt sich , da sie am Ende noch mehr macht, aber das war für die Frage wie bzw. was zurückgegeben wird nicht wirklich relevant. (Ups, das doppelte "df = " war ein Kopierfehler)
Ich habe es mittlerweile auch ausprobiert und es funktioniert scheinbar problemlos.
Eine vielleicht naive Frage: Woher weiß ich, wann ein Objekt zurückgegeben wird und wann nur die Referenz auf ein Objekt und damit potentiell auf das gleiche Objekt :ugeek:
Gerade mit Listen hatte ich schon öfter das Problem, dass ich mit einer Referenz auf das gleiche Objekt gearbeitet habe, was dann zu (für mich) erstmal unerwarteten Effekten geführt hat :mrgreen:
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@antilet: Die Frage ist im Grunde einfach zu beantworten, es ist aber die falsche Frage: Du bekommst technisch gesehen im Hintergrund *immer* die Referenz auf ein Objekt. Ob das potentiell das selbe Objekt ist wie ein anderes muss dokumentiert sein. Ist es oft nicht, dann müsste man mal kurz überlegen was den in der Implementierung sinnvoller ist. In diesem Fall also wie unglaublich unsinnig es wäre oder ob das überhaupt möglich ist das `read_excel()` immer das *selbe* Objekt liefert bei jedem Aufruf, das heisst nur ein einziges mal eines angelegt und dann immer verändert wird wenn man etwas lädt und sich dieses eine Objekt auch intern und global merkt, das also eigentlich nie wieder freigegeben werden kann vor Programmende.

Und das liesse sich ja auch sehr leicht überprüfen ob dem so ist.

Guter Programmierstil ist auch eher neue Objekte erstellen statt vorhandene zu verändern, sofern das nicht dokumentiert oder sehr klar ist, dass eine Funktion Zustand verändert.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten