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.

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

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

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


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.


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

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.