Seite 1 von 1

Rückgabe einer .transform Methode in ein Dataframe umwandeln

Verfasst: Montag 18. April 2022, 16:48
von nichtSoGuter
Guten Tag,

ich habe eine transform Methode geschrieben, der ein Dataframe übergeben wird.
Dieser Dataframe wird dann in ein np.array umgewandelt.
Dann werden Rechenoperationen zwischen den Spalten durchgeführt und in einer neuen Spalte gespeichert.
Also erhalte ich am ende einen np.array, welcher mehr Spalten hat als der np.array der am Ende zurückgegeben wird.

Nun möchte ich das zurückgegebene array mit den zusätzlichen Spalten in ein Dataframe umwandeln. wie stelle ich das an? (siehe Code 1)

CODE 1

Code: Alles auswählen

    # Transform methode gibt Array zurück (kein Dataframe!)
    def transform(self, X, y = None):
       
        # von dem übergebene Parameter (X = np.array)  sollen die Spalten von einander dividiert werden 
        # und in einer anderen Spalte gespeichert werden
        # dann wird am ende das übergebene Array mit den zusätzlichen Spalten zurückgegeben
     
         # Folgende Spalten soll in das Dataframe aufgenommen werden
        schlafzimmerProHaushaltSpalte = X[:,bedroom_index]/X[:,households_index]
        zimmerProHaushaltSpalte = X[:,room_index]/X.values[:,households_index]
       
            return np.c_[X, schlafzimmerProHaushaltspalte ,zimmerProHaushalt]   
Die Frage ist nun wie ich das zurückgegebene Array in ein Dataframe umwandele
Meine Idee war (siehe Code 2)

Code 2

Code: Alles auswählen

  
  # der Parameter der in die Methode übergeben werden soll heißt "übergebener_Dataframe"
  # am ende sollen die zusätzlichen Spalten, die in der Methode berechnet werden, an  "übergebener_Dataframe" angehängt werden
  rückgabe_der_Methode =attribut_adder.transform( übergebener_Dataframe )
  rückgabe_als_Dataframe = pd.DataFrame( übergebener_Dataframe , index = übergebener_Dataframe .index, columns = übergebener_Dataframe .columns)
  
Das Problem bei dem Code 2 ist, dass die zusätzlichen Spalten nicht angezeigt werden

Re: Rückgabe einer .transform Methode in ein Dataframe umwandeln

Verfasst: Montag 18. April 2022, 16:57
von __deets__
Wie unterscheidet sich das denn von deinem ersten Post? Und dem, was dir da geraten wurde in Bezug auf die Dokumentation, und den Hinweis, was du *konkret* versucht hast, und was dann nicht so klappt wie gewuenscht?

Denn mit diesem Post, der sogar noch weniger Details enthaelt, kann man da auch nicht mehr zu sagen.

Re: Rückgabe einer .transform Methode in ein Dataframe umwandeln

Verfasst: Montag 18. April 2022, 17:13
von nichtSoGuter
Danke für deine Rückmeldung!

Das Problem aus meinem ersten Post habe ich dann doch lösen können. Das Problem hier ist ein anderer.
Ich möchte die zusätzlichen Spalten des np.arrays in das Dataframe mit aufnehmen.
Ich habe den Post nochmal überarbeitet. Soll ich noch konkreter werden oder passt das so?

Re: Rückgabe einer .transform Methode in ein Dataframe umwandeln

Verfasst: Montag 18. April 2022, 18:11
von nichtSoGuter
nichtSoGuter hat geschrieben: Montag 18. April 2022, 16:48 Guten Tag,

ich habe eine transform Methode geschrieben, der ein Dataframe übergeben wird.
Dieser Dataframe wird dann in ein np.array umgewandelt.
Dann werden Rechenoperationen zwischen den Spalten durchgeführt und in einer neuen Spalte gespeichert.
Also erhalte ich am ende einen np.array, welcher mehr Spalten hat als der np.array der am Ende zurückgegeben wird.

Nun möchte ich das zurückgegebene array mit den zusätzlichen Spalten in ein Dataframe umwandeln. wie stelle ich das an? (siehe Code 1)

CODE 1

Code: Alles auswählen

    # Transform methode gibt Array zurück (kein Dataframe!)
    def transform(self, X, y = None):
       
        # von dem übergebene Parameter (X = np.array)  sollen die Spalten von einander dividiert werden 
        # und in einer anderen Spalte gespeichert werden
        # dann wird am ende das übergebene Array mit den zusätzlichen Spalten zurückgegeben
     
         # Folgende Spalten soll in das Dataframe aufgenommen werden
        schlafzimmerProHaushaltSpalte = X[:,bedroom_index]/X[:,households_index]
        zimmerProHaushaltSpalte = X[:,room_index]/X[:,households_index]
       
            return np.c_[X, schlafzimmerProHaushaltspalte ,zimmerProHaushalt]   
Die Frage ist nun wie ich das zurückgegebene Array in ein Dataframe umwandele
Meine Idee war (siehe Code 2)

Code 2

Code: Alles auswählen

  
  # der Parameter der in die Methode übergeben werden soll heißt "übergebener_Dataframe"
  # am ende sollen die zusätzlichen Spalten, die in der Methode berechnet werden, an  "übergebener_Dataframe" angehängt werden
  rückgabe_der_Methode =attribut_adder.transform( übergebener_Dataframe )
  rückgabe_als_Dataframe = pd.DataFrame( rückgabe_der_Methode , index = übergebener_Dataframe .index, columns = [übergebener_Dataframe.columns, "zusätzlicher_Spaltenname1", "zusätzlicher_Spaltenname2" ])
  
Das ist der Fehler der bei mir angezeigt wird : ValueError: Shape of passed values is (16512, 13), indices imply (16512, 4)

Re: Rückgabe einer .transform Methode in ein Dataframe umwandeln

Verfasst: Montag 18. April 2022, 19:35
von __deets__
Laut Fehlermeldung musst du einfach nur den Index weglassen, reicht da nicht ein simples

Code: Alles auswählen

pd.DataFrame(rueckgabe_der_methode)
Das ist im uebrigen ein wirklich schlechter Name. Genauso wie "transform". Viel generischer geht's ja nicht mehr, das wird auf Dauer schwer fuer dich, da den Ueberblick zu behalten.

Re: Rückgabe einer .transform Methode in ein Dataframe umwandeln

Verfasst: Montag 18. April 2022, 23:30
von nichtSoGuter
Danke!
Ich habs mir wohl unnötig schwer gemacht😅

Re: Rückgabe einer .transform Methode in ein Dataframe umwandeln

Verfasst: Montag 18. April 2022, 23:41
von nichtSoGuter
Das Problem bei dem vorgehen ist aber leider, dass ich dann nicht mehr weiß was zu welcher spalte gehört.
Wie kann ich die spaltennamen aus dem alten DataFrame beibehalten und nur die hinzugefügten Spalten neu benennen?
Bei dem beispiel wüsste ich ja zb nicht welche spalte die "schlafzimmerProHaushaltSpalte" ist.
Man könnte das hier bei dem beispiel vielleicht leicht herausfinden. Bei anderen fällen wäre das aber vielleicht gar nicht soo einfach.
Wenn ich zb die methode OneHotEncoder anwenden würde, dann würde die funktion für jede kategorie eine neue Spalte hinzufügen. Woher würde ich dann wissen welche spalte zu welcher kategorie gehört