So setzen Sie eine Zelle in einem Pandas-Datenrahmen auf NaN

97

Ich möchte schlechte Werte in einer Spalte eines Datenrahmens durch NaNs ersetzen.

mydata = {'x' : [10, 50, 18, 32, 47, 20], 'y' : ['12', '11', 'N/A', '13', '15', 'N/A']}
df = pd.DataFrame(mydata)

df[df.y == 'N/A']['y'] = np.nan

Die letzte Zeile schlägt jedoch fehl und gibt eine Warnung aus, da sie an einer Kopie von df arbeitet. Also, wie geht man damit richtig um? Ich habe viele Lösungen mit iloc oder ix gesehen, aber hier muss ich eine boolesche Bedingung verwenden.

Mark Morrisson
quelle

Antworten:

122

benutze einfach replace:

In [106]:
df.replace('N/A',np.NaN)

Out[106]:
    x    y
0  10   12
1  50   11
2  18  NaN
3  32   13
4  47   15
5  20  NaN

Was Sie versuchen, heißt Kettenindizierung: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

Sie können locFolgendes verwenden, um sicherzustellen, dass Sie mit dem Original-dF arbeiten:

In [108]:
df.loc[df['y'] == 'N/A','y'] = np.nan
df

Out[108]:
    x    y
0  10   12
1  50   11
2  18  NaN
3  32   13
4  47   15
5  20  NaN
EdChum
quelle
13

Während die Verwendung replacedas Problem zu lösen scheint, möchte ich eine Alternative vorschlagen. Problem mit der Mischung aus numerischen und einigen Zeichenfolgenwerten in der Spalte, um Zeichenfolgen nicht durch np.nan zu ersetzen, sondern um die gesamte Spalte richtig zu machen. Ich würde wetten, dass die ursprüngliche Spalte höchstwahrscheinlich von einem Objekttyp ist

Name: y, dtype: object

Was Sie wirklich brauchen, ist, es zu einer numerischen Spalte zu machen (es hat den richtigen Typ und wäre ziemlich schneller), wobei alle nicht numerischen Werte durch NaN ersetzt werden.

Somit wäre ein guter Konvertierungscode

pd.to_numeric(df['y'], errors='coerce')

Geben Sie errors='coerce'an, dass Zeichenfolgen, die nicht auf einen numerischen Wert analysiert werden können, zu NaN werden sollen. Spaltentyp wäre

Name: y, dtype: float64
Severin Pappadeux
quelle
10

Sie können ersetzen verwenden:

df['y'] = df['y'].replace({'N/A': np.nan})

Beachten Sie auch den inplaceParameter für replace. Sie können so etwas tun wie:

df.replace({'N/A': np.nan}, inplace=True)

Dies ersetzt alle Instanzen in der df, ohne eine Kopie zu erstellen.

Wenn Sie auf andere Arten unbekannter Werte stoßen, z. B. leere Zeichenfolge oder Wert "Keine":

df['y'] = df['y'].replace({'': np.nan})

df['y'] = df['y'].replace({None: np.nan})

Referenz: Pandas Neueste - Ersetzen

jmorrison
quelle
1
df.loc[df.y == 'N/A',['y']] = np.nan

Dies löst Ihr Problem. Mit dem doppelten [] arbeiten Sie an einer Kopie des DataFrame. Sie müssen den genauen Standort in einem Anruf angeben, um ihn ändern zu können.

jeremie benichou
quelle
0

Sie können diese Schnipsel ausprobieren.

In [16]: mydata = {'x': [10, 50, 18, 32, 47, 20], 'y': ['12', '11', 'N / A', '13', ' 15 ',' N / A ']}
In [17]: df = pd.DataFrame (mydata)

In [18]: df.y [df.y == "N / A"] = np.nan

Out [19]: df 
    xy
0 10 12
1 50 11
2 18 NaN
3 32 13
4 47 15
5 20 NaN
rolandpeng
quelle
0

Ab Pandas 1.0.0 müssen Sie numpy nicht mehr verwenden, um Nullwerte in Ihrem Datenrahmen zu erstellen. Stattdessen können Sie einfach pandas.NA (vom Typ pandas._libs.missing.NAType) verwenden, sodass es innerhalb des Datenrahmens als null behandelt wird, außerhalb des Datenrahmenkontexts jedoch nicht null.

slevin886
quelle