Angenommen, ich habe einen Pandas-DataFrame mit zwei Spalten, A und B. Ich möchte diesen DataFrame so ändern (oder eine Kopie erstellen), dass B immer NaN ist, wenn A 0 ist. Wie würde ich das erreichen?
Ich habe folgendes versucht
df['A'==0]['B'] = np.nan
und
df['A'==0]['B'].values.fill(np.nan)
ohne Erfolg.
where
wie in dieser Lösung unten gezeigtAntworten:
Verwendung
.loc
für die etikettenbasierte Indizierung:Der
df.A==0
Ausdruck erstellt eine boolesche Reihe, die die Zeilen indiziert und'B'
die Spalte auswählt. Sie können dies auch verwenden, um eine Teilmenge einer Spalte zu transformieren, z.Ich weiß nicht genug über Pandas-Interna, um genau zu wissen, warum das funktioniert, aber das grundlegende Problem ist, dass die Indizierung in einen DataFrame manchmal eine Kopie des Ergebnisses und manchmal eine Ansicht des Originalobjekts zurückgibt. Laut Dokumentation hier hängt dieses Verhalten vom zugrunde liegenden Numpy-Verhalten ab. Ich habe festgestellt, dass der Zugriff auf alles in einem Vorgang (anstatt auf [eins] [zwei]) eher für die Einstellung funktioniert.
quelle
Hier ist aus Pandas-Dokumenten zur erweiterten Indizierung:
In diesem Abschnitt erfahren Sie genau, was Sie brauchen! Es stellt sich heraus
df.loc
(wie .ix veraltet ist - wie viele unten ausgeführt haben), kann zum kühlen Schneiden / Würfeln eines Datenrahmens verwendet werden. Und. Es kann auch verwendet werden, um Dinge einzustellen.Brens Antwort lautet also: "Finde alle Orte, an denen du eine
df.A == 0
Spalte auswählstB
und aufnp.nan
". "quelle
loc[selection criteria, columns I want]
bleibt es perfekt in deinem Kopf ...Ab Pandas ist 0.20 ix veraltet . Der richtige Weg ist, df.loc zu verwenden
Hier ist ein funktionierendes Beispiel
Erläuterung:
Wie im Dokument hier erläutert ,
.loc
basiert es hauptsächlich auf Beschriftungen, kann aber auch mit einem booleschen Array verwendet werden .Also, was wir oben tun, ist sich zu bewerben
df.loc[row_index, column_index]
durch:loc
ein boolesches Array als Maske verwendet werden kann, die Pandas mitteilt, in welcher Teilmenge von Zeilen wir ändern möchtenrow_index
loc
ist auch beschriftungsbasiert, um die Spalte unter Verwendung der Beschriftung'B'
in der auszuwählencolumn_index
Wir können logische, bedingte oder beliebige Operationen verwenden, die eine Reihe von Booleschen Werten zurückgeben, um das Array von Booleschen Werten zu erstellen. Im obigen Beispiel möchten wir alle
rows
, die ein enthalten0
, für das wir verwenden könnendf.A == 0
, wie Sie im folgenden Beispiel sehen können. Dies gibt eine Reihe von Booleschen Werten zurück.Dann verwenden wir das obige Array von Booleschen Werten, um die erforderlichen Zeilen auszuwählen und zu ändern:
Weitere Informationen finden Sie in der Dokumentation zur erweiterten Indizierung hier .
quelle
Verwenden Sie für eine massive Geschwindigkeitssteigerung die where-Funktion von NumPy.
Konfiguration
Erstellen Sie einen zweispaltigen DataFrame mit 100.000 Zeilen mit einigen Nullen.
Schnelle Lösung mit
numpy.where
Timings
Numpy's
where
ist ungefähr 4x schnellerquelle
.values
innp.where(df.a.values == 0, np.nan, df.b.values)
? Sieht aus wienp.where(df.a == 0, np.nan, df.b)
funktioniert auch?Um mehrere Spalten zu ersetzen, konvertieren Sie sie in ein numpy-Array mit
.values
:quelle