Ich versuche, meinen Stata-Code für Geschwindigkeitsverbesserungen in Python umzuprogrammieren, und ich wurde in Richtung PANDAS gezeigt. Es fällt mir jedoch schwer, mich mit der Verarbeitung der Daten zu beschäftigen.
Angenommen, ich möchte alle Werte in der Spaltenüberschrift 'ID' durchlaufen. Wenn diese ID mit einer bestimmten Nummer übereinstimmt, möchte ich zwei entsprechende Werte ändern: Vorname und Nachname.
In Stata sieht es so aus:
replace FirstName = "Matt" if ID==103
replace LastName = "Jones" if ID==103
Dies ersetzt also alle Werte in FirstName, die den Werten von ID == 103 bis Matt entsprechen.
In PANDAS versuche ich so etwas
df = read_csv("test.csv")
for i in df['ID']:
if i ==103:
...
Ich bin mir nicht sicher, wohin ich von hier aus gehen soll. Irgendwelche Ideen?
df.loc[df.ID == 103, ['FirstName', 'LastName']] = 'Matt', 'Jones'
Sie können verwenden
map
, es kann Werte aus einer Diktatur oder sogar einer benutzerdefinierten Funktion abbilden.Angenommen, dies ist Ihr df:
Erstellen Sie die Diktate:
Und Karte:
Das Ergebnis wird sein:
Oder verwenden Sie eine benutzerdefinierte Funktion:
quelle
dict
für das Mapping erstellt wurde. Andernfalls kann eine Überprüfung / Reinigung durchgeführt werden, basierend auf:df.ID.isin(names.keys())
Die ursprüngliche Frage befasst sich mit einem bestimmten engen Anwendungsfall. Für diejenigen, die allgemeinere Antworten benötigen, sind hier einige Beispiele:
Erstellen einer neuen Spalte mit Daten aus anderen Spalten
Angesichts des folgenden Datenrahmens:
Im Folgenden fügen wir eine neue
description
Spalte als Verkettung anderer Spalten hinzu, indem wir die+
Operation verwenden, die für Serien überschrieben wird. Ausgefallene String-Formatierungen, F-Strings usw. funktionieren hier nicht, da dies+
für Skalare und nicht für 'primitive' Werte gilt:Wir bekommen
1 years
für die Katze (anstelle von1 year
), die wir unten unter Verwendung von Bedingungen reparieren werden.Ändern einer vorhandenen Spalte mit Bedingungen
Hier ersetzen wir die ursprüngliche
animal
Spalte durch Werte aus anderen Spalten und verwendennp.where
, um eine bedingte Teilzeichenfolge basierend auf dem Wert vonage
:Ändern mehrerer Spalten mit Bedingungen
Ein flexiblerer Ansatz besteht darin,
.apply()
einen gesamten Datenrahmen anstelle einer einzelnen Spalte aufzurufen:Im obigen Code
transform_row(r)
nimmt die Funktion einSeries
Objekt, das eine bestimmte Zeile darstellt (angezeigt durchaxis=1
, der Standardwert vonaxis=0
liefert einSeries
Objekt für jede Spalte). Dies vereinfacht die Verarbeitung, da wir mithilfe der Spaltennamen auf die tatsächlichen 'primitiven' Werte in der Zeile zugreifen können und andere Zellen in der angegebenen Zeile / Spalte sichtbar sind.quelle
np.where
ist wahrscheinlich das, wonach Sie suchen, siehe z. B. stackoverflow.com/a/42540310/191246, aber es ist auch möglich, dass Sie die Logik nicht in eine skalare Operation einpassen können, dann müssten Sie explizit transformieren Die Zelle ähnelt numerisch dertransform_row
Diese Frage wird möglicherweise immer noch so oft gestellt, dass es sich lohnt, einen Nachtrag zur Antwort von Herrn Kassies anzubieten. Die
dict
integrierte Klasse kann in Unterklassen unterteilt werden, sodass ein Standardwert für fehlende Schlüssel zurückgegeben wird. Dieser Mechanismus funktioniert gut für Pandas. Aber siehe unten.Auf diese Weise können wichtige Fehler vermieden werden.
Das Gleiche kann auf folgende Weise einfacher gemacht werden. Die Verwendung des 'Standard'-Arguments für die
get
Methode eines Diktierobjekts macht es unnötig, ein Diktat in Unterklassen zu unterteilen.quelle