while Schleife

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
Hias_L
User
Beiträge: 15
Registriert: Dienstag 16. Juli 2019, 08:44

Hallo Leute,

ich probiere folgende Schleife zum laufen zu kriegen:

df_1 ist ein DataFrame (356,22) mit mehreren Jahren (2014 bis 2018)
Die "Rho" Werte sollen addiert werden und die Summen jedes Datensatzes in einer zusätzlichen Spalte am Ende angefügt werden.

Code: Alles auswählen

 df_1 = df
varJahr = 2014
while varJahr <= 2018:
    print(varJahr)
    df_Rho_Summe = df_1['Rho_Summe'] = np.where(df_1['Jahr'] == varJahr, 
                                 df_1['Rho-Invest'] + df_1['Rho-WI'] + df_1['Rho-EU'] + 
                                 df_1['Rho-BMBF'] + df_1['Rho-BUND'] + df_1['Rho-Land'] + 
                                 df_1['Rho-Zuk'] - df_1['Rho-VE'] + df_1['Rho-RV'],
                                 np.nan)
    varJahr = varJahr +1
    df_1 = df_1 + df_Rho_Summe 
    
print('Ende')
Als Ergebnis erhalte ich zwar die neue Spalte 'Rho_Summe' hinten an df_1. Die Summe jedoch nur für 2014.

Aus dem ValueError: "Unable to coerce to Series, length must be 22: given 356"
werde ich nicht leider ganz schlau.

Ich hoffe das ist einigermaßen verständlich.

Vielen Dank schon einmal
Hias
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Warum nennst Du `df` in `df_1` um. `df_1` ist ein genauso schlechter Name wie `df`. Benutze aussagekräfte Variabelnnamen! Was soll varJahr bedeuten? Ich kennen nur Wahljahr.

Was Denkst Du macht `df_1 = df_1 + df_Rho_Summe`?

Die while-Schleife sollte eine for-Schleife sein und wenn ich richtige rate, was Du eigentlich machen willst, ist die Schleife komplett unnötig.
Hias_L
User
Beiträge: 15
Registriert: Dienstag 16. Juli 2019, 08:44

Die Benennung ist nicht gut, stimmt! Ich möchte vorhandenes nacherstellen und daher bin ich nicht einfallsreich.

Die Erstellung geht ohne Schleife problemlos. Die while-Bedingung geht ohne Schleife auch problemlos.

Eigentlich möchte ich die while Schleife in Kombination mit where hinbekommen.
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Warum brauchst Du where wenn Du sowieso für alle Werte die Summe ausrechnen willst?

Kannst Du ein einfaches Beispiel mit Daten und gewolltem Ergebnis erstellen?
Hias_L
User
Beiträge: 15
Registriert: Dienstag 16. Juli 2019, 08:44

Es geht mir rein um das Verständnis. Normal würde ich alle erstellen und dann filtern.

Ich hab es fast:

Code: Alles auswählen

df_1 = df
varJahr = 2014
while varJahr <= 2018:
    print(varJahr)
    df_1['Rho_Summe'] = np.where(df_1['Jahr'] == varJahr, 
                                 df_1['Rho-Invest'] + df_1['Rho-WI'] + df_1['Rho-EU'] + 
                                 df_1['Rho-BMBF'] + df_1['Rho-BUND'] + df_1['Rho-Land'] + 
                                 df_1['Rho-Zuk'] - df_1['Rho-VE'] + df_1['Rho-RV'], np.nan)
                                 
    varJahr = varJahr +1
    
    
print('Ende')
- Jetzt fügt er die Spalte 'Rho_Summe' an.
- Nur in dem letztmöglichen Jahr, hier 2018, trägt er die gewünschte Summe in Spalte 'Rho_Summe' in df_1 ein. Wenn ich z.B. 2016 auswähle, habe ich die Summe in 2016 und davor und danach "nan".

Die vorherigen Jahre werden mit "nan" überschrieben.

Ein einfaches Beispiel kann ich natürlich gerne erstellen.

Sehe ich das richtig?
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Es wird `nan` geschrieben, weil Du es so angegeben hast.
Daher nochmal die Frage, warum Du überhaupt `where` benutzt?
Benutzeravatar
__blackjack__
User
Beiträge: 14045
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wobei man selbst wenn man die ``while``-Schleife bräuchte, sie sehr wahrscheinlich nicht bräuchte, weil man das dann mit `groupby()` machen würde.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Hias_L
User
Beiträge: 15
Registriert: Dienstag 16. Juli 2019, 08:44

Ok, ok ich verschone Euch mit meiner 'while'-Schleife :)
Ich kriege es ja hin, mich hätte es ja rein wegen der Syntax interessiert.

Eine aller letzte Frage: Ich gebe ja das np.nan an. Kann man an der Stelle auch angeben, dass nichts unternommen werden soll ?
Benutzeravatar
__blackjack__
User
Beiträge: 14045
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Hias_L: Was heisst ”nichts”?
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Was willst Du anstatt der while-Schleife denn tun?
Hias_L
User
Beiträge: 15
Registriert: Dienstag 16. Juli 2019, 08:44

Mit nichts meine ich einfach keine Berücksichtigung an der Stelle, damit ein ggf. vorhandener Wert nicht überschrieben wird.
Die Jahre werden doch aufsummiert pro Jahr/Durchlauf, bis zum letzten angegebenen Jahr (<=2018). Durch das np.nan wird das nicht aktuell betrachtete Jahr mit nan wieder überschrieben. Oder sehe ich das falsch?

@Sirius3 Ich tüftle weiter rum
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Von Deinem Code bleibt das hier übrig:

Code: Alles auswählen

df['Rho_Summe'] = (df['Rho-Invest'] + df['Rho-WI'] + df['Rho-EU'] + 
                   df['Rho-BMBF'] + df['Rho-BUND'] + df['Rho-Land'] + 
                   df['Rho-Zuk'] - df['Rho-VE'] + df['Rho-RV'])
print('Ende')
alles andere stört nur.
Hias_L
User
Beiträge: 15
Registriert: Dienstag 16. Juli 2019, 08:44

Damit hat man alle DS ja.

Danke für Eure Hilfe!

Gruß und schönen Tag
Hias
Antworten