Angenommen, ich habe einen Datenrahmen (oder Serie) wie folgt aus:Pandas gelten, aber der Zugang zuvor berechneten Wert
Value
0 0.5
1 0.8
2 -0.2
3 None
4 None
5 None
Ich möchte ein neues Ergebnis Spalte erstellen.
Der Wert jedes Ergebnisses wird durch den Wert vorheriger Wert über eine beliebige Funktion f
bestimmt.
Wenn der vorherige Wert nicht verfügbar ist (Keine oder NaN), möchte ich stattdessen das vorherige Ergebnis verwenden (und natürlich f
darauf anwenden).
Mit dem vorherigen Wert ist einfach, ich brauche nur shift
zu verwenden. Der Zugriff auf das vorherige Ergebnis scheint jedoch nicht so einfach zu sein.
Der folgende Code berechnet beispielsweise das Ergebnis, kann jedoch bei Bedarf nicht auf das vorherige Ergebnis zugreifen.
df['Result'] = df['Value'].shift(1).apply(f)
Gehen Sie davon aus, dass f
willkürlich ist, und somit Lösungen Dinge wie cumsum
sind nicht möglich verwenden.
Offensichtlich kann dies durch Iteration erfolgen, aber ich möchte wissen, ob eine Panda-y-Lösung existiert.
df['Result'] = None
for i in range(1, len(df)):
value = df.iloc[i-1, 'Value']
if math.isnan(value) or value is None:
value = df.iloc[i-1, 'Result']
df.iloc[i, 'Result'] = f(value)
Beispiel Ausgang gegeben f = lambda x: x+1
:
Bad:
Value Result
0 0.5 NaN
1 0.8 1.5
2 -0.2 1.8
3 NaN 0.8
4 NaN NaN
5 NaN NaN
Gut:
Value Result
0 0.5 NaN
1 0.8 1.5
2 -0.2 1.8
3 NaN 0.8
4 NaN 1.8 <-- previous Value not available, used f(previous result)
5 NaN 2.8 <-- same
Wie wäre es 'df [ 'Ergebnis'] = df [ 'Value']. shift (1) .apply (f) .fill() '? – IanS
@IanS Die mit 'ffill' aufgefüllten Werte werden nicht mit' f' versehen. – gberger
Editierte Stelle, um das obige zu verdeutlichen – gberger