Ab Pandas ist 0.20 ix veraltet . Der richtige Weg ist, df.loc zu verwenden
Hier ist ein funktionierendes Beispiel
>>> import pandas as pd
>>> import numpy as np
>>> df = pd.DataFrame({"A":[0,1,0], "B":[2,0,5]}, columns=list('AB'))
>>> df.loc[df.A == 0, 'B'] = np.nan
>>> df
A B
0 0 NaN
1 1 0
2 0 NaN
>>>
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:
- Ausnutzung der Tatsache, dass
loc
ein boolesches Array als Maske verwendet werden kann, die Pandas mitteilt, in welcher Teilmenge von Zeilen wir ändern möchtenrow_index
- Die Tatsache auszunutzen
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 enthalten 0
, für das wir verwenden können df.A == 0
, wie Sie im folgenden Beispiel sehen können. Dies gibt eine Reihe von Booleschen Werten zurück.
>>> df = pd.DataFrame({"A":[0,1,0], "B":[2,0,5]}, columns=list('AB'))
>>> df
A B
0 0 2
1 1 0
2 0 5
>>> df.A == 0
0 True
1 False
2 True
Name: A, dtype: bool
>>>
Dann verwenden wir das obige Array von Booleschen Werten, um die erforderlichen Zeilen auszuwählen und zu ändern:
>>> df.loc[df.A == 0, 'B'] = np.nan
>>> df
A B
0 0 NaN
1 1 0
2 0 NaN
Weitere Informationen finden Sie in der Dokumentation zur erweiterten Indizierung hier .
where
wie in dieser Lösung unten gezeigt