Mit einer if-Anweisung in einen dataframe mit lambda-Funktionen
Ich versuche eine neue Spalte hinzufügen, um ein dataframe basiert auf einer if-Anweisung abhängig von den Werten der beiden Spalten. d.h. wenn Spalte x == Keine dann die y-Spalte andere Spalte x
unten ist das Skript, das ich geschrieben habe, aber nicht funktioniert. irgendwelche Ideen?
dfCurrentReportResults['Retention'] = dfCurrentReportResults.apply(lambda x : x.Retention_y if x.Retention_x == None else x.Retention_x)
Auch ich bekam diese Fehlermeldung:
AttributeError: ("'- Serie,' Objekt hat kein Attribut 'Retention_x'", u'occurred bei index BUSINESSUNIT_NAME')
fyi: BUSINESSUNIT_NAME ist die erste Spalte name
Zusätzliche Info:
Meine Daten ausgedruckt sieht wie folgt aus, und ich will hinzufügen einer 3. Spalte einen Wert, wenn es einem sonst halten NaN.
Retention_x Retention_y
0 1 NaN
1 NaN 0.672183
2 NaN 1.035613
3 NaN 0.771469
4 NaN 0.916667
5 NaN NaN
6 NaN NaN
7 NaN NaN
8 NaN NaN
9 NaN NaN
UPDATE:
Am Ende wurde ich mit Fragen verweisen auf die Null oder ist Null in mein dataframe die Letzte Zeile des code I wird auch verwendet, einschließlich der Achse = 1 meine Frage beantwortet.
dfCurrentReportResults['RetentionLambda'] = dfCurrentReportResults.apply(lambda x : x['Retention_y'] if pd.isnull(x['Retention_x']) else x['Retention_x'], axis = 1)
Dank @EdChum, @strim099 und @aus_lacy für all deinen input. Als mein Datensatz größer wird, kann ich wechseln, um das np.wo option, wenn ich merke, die performance-Probleme.
- ist
None
ein string oder einNaN
? Und könnten Sie eine Probe Ihres Daten-frame, so können wir besser Debuggen irgendwelche Probleme? - meine Verwendung der Keiner war im Grunde ein Versuch, um zu ermitteln, ob der Wert leer, so dass ich denke, es ist ein NaN und ist Keiner?
- welche Spalte fordern Sie Ihre
apply
auf? Eine Probe der Daten helfen würde, erhalten Sie eine Antwort viel schneller. - Ich möchte die Funktion für die neue Spalte ein und erhalten die Ergebnisse, die durch den Verweis auf die anderen beiden Spalten. Die Daten ist ein bisschen chaotisch und auch vertraulich, ich werde versuchen und klopfen gemeinsam einige einfache Daten für die Frage.
Du musst angemeldet sein, um einen Kommentar abzugeben.
You ' r lambda-Betrieb ist auf der 0-Achse, die columnwise. Fügen Sie einfach
axis=1
zu denapply
arg-Liste. Dies ist eindeutig dokumentiert.x.Retention_x == None
zunumpy.isnan(x.Retention_x)
Verwenden Sie einfach
np.where
:Dieser setzt die Bedingung, die ersten Parameter und setzt den Wert auf
df.Retention_y
sonstdf.Retention_x
vermeiden Sie auch den Einsatz
apply
wo möglich, da dies nur geht, um eine Schleife über die Werte,np.where
ist eine vektorisierte Methode und wird viel besser skalieren.UPDATE
OK, keine Notwendigkeit zu verwenden
np.where
verwenden Sie einfach die folgende einfachere syntax:Weiteres update
numpy
-- frames und Serien habenwhere
Methoden zu..where
syntax etwas verwirrend, vor einer Weile durch einige subtile Unterschiede, so begann ich mitnp.where
von diesem Punkt an, vielleicht ist die Zeit zu gehen Sie zurück und betrachten Sie es wieder, ich poste ein update, dankeisnull()
aktualisierte Antwortnumpy
syntax einfacher zu Lesen ist:dfCurrentReportResults['Retention'] = np.where(df.Retention_x.isnull(), df.Retention_y, df.Retention_x)
aber das ist fast völlig Objektiv.