Ich habe einen DataFrame und möchte die Werte in einer bestimmten Spalte, die einen Wert überschreiten, durch Null ersetzen. Ich hatte gedacht, dies sei ein Weg, dies zu erreichen:
df[df.my_channel > 20000].my_channel = 0
Wenn ich den Kanal in einen neuen Datenrahmen kopiere, ist das ganz einfach:
df2 = df.my_channel
df2[df2 > 20000] = 0
Dies macht genau das, was ich will, scheint aber nicht mit dem Kanal als Teil des ursprünglichen DataFrame zu funktionieren.
Antworten:
.ix
Der Indexer funktioniert für Pandas-Versionen vor 0.20.0 einwandfrei. Da Pandas 0.20.0 jedoch nicht verfügbar ist, ist der.ix
Indexer veraltet . Sie sollten ihn daher vermeiden. Stattdessen können Sie.loc
oderiloc
Indexer verwenden. Sie können dieses Problem lösen, indem Sie:Oder in einer Zeile:
mask
hilft Ihnen bei der Auswahl der Zeilen, in denendf.my_channel > 20000
sich der Name 0 befindetTrue
, unddf.loc[mask, column_name] = 0
setzt den Wert 0 auf die ausgewählten Zeilen, in denenmask
in der Spalte der Name stehtcolumn_name
.Update: In diesem Fall sollten
loc
Sie verwendeniloc
, da Sie bei Verwendung eine Meldung erhaltenNotImplementedError
, dass die iLocation-basierte boolesche Indizierung für einen Ganzzahltyp nicht verfügbar ist .quelle
Versuchen
Hinweis: Seit v0.20.0
ix
ist zugunsten vonloc
/ veraltetiloc
.quelle
np.where
Funktion funktioniert wie folgt:In Ihrem Fall möchten Sie:
quelle
Der Grund, warum Ihr ursprünglicher Datenrahmen nicht aktualisiert wird, liegt darin, dass die verkettete Indizierung dazu führen kann, dass Sie eine Kopie anstelle einer Ansicht Ihres Datenrahmens ändern. Die Dokumente geben diesen Rat:
Sie haben einige Alternativen: -
loc
+ Boolesche Indizierungloc
kann zum Festlegen von Werten verwendet werden und unterstützt Boolesche Masken:mask
+ Boolesche IndizierungSie können Ihrer Serie zuordnen:
Oder Sie können Ihre Serie an Ort und Stelle aktualisieren:
np.where
+ Boolesche IndizierungSie können NumPy verwenden, indem Sie Ihre Originalserie zuweisen, wenn Ihre Bedingung nicht erfüllt ist. Die ersten beiden Lösungen sind jedoch sauberer, da sie explizit nur die angegebenen Werte ändern.
quelle
Ich würde die
lambda
Funktion aufSeries
einemDataFrame
solchen verwenden:Ich behaupte nicht, dass dies ein effizienter Weg ist, aber es funktioniert gut.
quelle
loc
hier wie verwendendf.loc[: , 'my_column'] = df['my_column'].map(f)
. Ich weiß nicht, ob es so schnell ist wie die, die Sie unten hinzugefügt haben.Versuche dies:
df.my_channel = df.my_channel.where(df.my_channel <= 20000, other= 0)
oder
df.my_channel = df.my_channel.mask(df.my_channel > 20000, other= 0)
quelle