Pandas dataframe - Wert aus vorhergehender Zeile kopieren

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
thorsten97
User
Beiträge: 3
Registriert: Freitag 8. Dezember 2017, 18:47

Hallo,

Ich habe einen Pandas Dataframe und möchte gerne unter bestimmten Bedingungen den Wert der vorhergehenden Zeile verwenden und Ihn als neuen Wert setzen.

Ich vermute mal mein Ansatz mit "shift" ist nicht der Richtige. Es wäre klasse wenn mir jemand von euch etwas unter die Arme greifen könnte.


Danke!

Code: Alles auswählen

import pandas as pd

df = pd.DataFrame({"A":[1,1,1,2,2,2,1,1,1],"B":[2,5,12,1,1,1,18,2,2]})
df["C"] = df["B"]
df.loc[df.A < df.B, "C"] = df["C"].shift(1)
Ausgabe:

Code: Alles auswählen

   A   B     C
0  1   2   NaN
1  1   5   2.0
2  1  12   5.0 #hier sollte 2.0 stehen weil ja in der vorhergehenden  Zeile 2.0 stand 
3  2   1   1.0  
4  2   1   1.0
5  2   1   1.0
6  1  18   1.0
7  1   2  18.0 # hier sollte 1.0 stehen weil ja in der vorhergehenden  Zeile 1.0 stand 
8  1   2   2.0 # hier sollte 1.0 stehen 
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Da fehlt völlig eine Entscheidungsgrundlage WARUM du in welchen Zeilen den Wert der Zeile davor haben willst. Das müsste mal als erstes definiert werden.
thorsten97
User
Beiträge: 3
Registriert: Freitag 8. Dezember 2017, 18:47

wenn df.loc[df.A < df.B, "C"] ist möchte ich in dieser Zeile den vorherigen Wert von "C" bekommen und in der aktuellen Zeile als "C" setzen.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wieso ist in der Zeile 1 (und folgerichtig dann auch 2) dann nicht NaN? Die Bedingung A < B trifft doch zu. Und gilt das dann auch fuer Zeile 6, nur dass du das nicht beschrieben hast, weil der Wert schon stimmt?
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ok, ich habe das nicht ganz begriffen, was du da gezeigt hast. C ist ja durch das shiften entstanden. Und eigentlich gar nicht relevant.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

So, ist dies das gewuenschte Ergebnis?

Code: Alles auswählen

#!/usr/bin/env python3.6
# -*- coding: utf-8 -*-
# For Python3.x

import pandas as pd

df = pd.DataFrame({"A":[1,1,1,2,2,2,1,1,1],"B":[2,5,12,1,1,1,18,2,2]})
df["C"] = df["B"]
work = df.A < df.B
accu = df.B[0]
for i, entry in enumerate(work):
    if entry:
        df.C[i] = accu
    else:
        accu = df.B[i]
print(df)
Ich bin selbst auch noch recht unerfahren in pandas, darum ist das ein bisschen zu fuss.
Antworten