it-swarm.com.de

So legen Sie eine Zelle in einem Pandas-Datenrahmen auf NaN fest

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, was ist der richtige Weg, um damit umzugehen? Ich habe viele Lösungen mit iloc oder ix gesehen, aber hier muss ich eine boolesche Bedingung verwenden.

55
Mark Morrisson

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 loc verwenden, um sicherzustellen, dass Sie die ursprüngliche dF verwenden:

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
68
EdChum

Während die Verwendung von replace das Problem zu lösen scheint, möchte ich eine Alternative vorschlagen. Problem bei der Mischung von numerischen Werten und einigen Zeichenfolgenwerten in der Spalte, damit die Zeichenfolgen nicht durch np.nan ersetzt werden, sondern die gesamte Spalte richtig ist. Ich würde wetten, dass die ursprüngliche Spalte höchstwahrscheinlich von einem Objekttyp ist

Name: y, dtype: object

Was Sie wirklich brauchen, ist eine numerische Spalte (sie wird den richtigen Typ haben und wäre schneller), wobei alle nicht numerischen Werte durch NaN ersetzt werden.

Ein guter Konvertierungscode wäre also

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

Geben Sie errors='coerce' an, damit Zeichenfolgen, die nicht in einen numerischen Wert geparst werden können, zu NaN werden. Spaltenart wäre

Name: y, dtype: float64
8

Sie können ersetzen ersetzen:

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

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

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

Dadurch werden alle Instanzen in der Datenbank ersetzt, ohne dass eine Kopie erstellt wird.

Wenn Sie auf andere Typen unbekannter Werte stoßen, z. B. leere Zeichenfolge oder None-Wert, gilt Folgendes:

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

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

Referenz: Pandas Latest - Ersetzen

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

Damit lösen Sie Ihr Problem. Mit dem Doppelklick [] 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 
 x y 0 0 12 12 1 50 11 2 2 NaN 3 32 13 4 4 15 15 20 20
0
rolandpeng