Numpy isnan () schlägt auf einem Array von Floats fehl (vom Pandas-Datenrahmen gelten)


98

Ich habe eine Reihe von Floats (einige normale Zahlen, einige Nans), die aus einer Anwendung auf einen Pandas-Datenrahmen hervorgehen.

Aus irgendeinem Grund schlägt numpy.isnan in diesem Array fehl. Wie unten gezeigt, ist jedes Element ein Float. Numpy.isnan wird in jedem Element korrekt ausgeführt. Der Typ der Variablen ist definitiv ein numpy-Array.

Was ist los?!

set([type(x) for x in tester])
Out[59]: {float}

tester
Out[60]: 
array([-0.7000000000000001, nan, nan, nan, nan, nan, nan, nan, nan, nan,
   nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
   nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
   nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
   nan, nan], dtype=object)

set([type(x) for x in tester])
Out[61]: {float}

np.isnan(tester)
Traceback (most recent call last):

File "<ipython-input-62-e3638605b43c>", line 1, in <module>
np.isnan(tester)

TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''

set([np.isnan(x) for x in tester])
Out[65]: {False, True}

type(tester)
Out[66]: numpy.ndarray

Antworten:


160

np.isnan kann auf NumPy-Arrays vom nativen Typ (wie np.float64) angewendet werden:

In [99]: np.isnan(np.array([np.nan, 0], dtype=np.float64))
Out[99]: array([ True, False], dtype=bool)

Löst jedoch TypeError aus, wenn es auf Objektarrays angewendet wird:

In [96]: np.isnan(np.array([np.nan, 0], dtype=object))
TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''

Da Sie Pandas haben, könnten Sie verwenden pd.isnull stattdessen NumPy-Arrays von Objekten oder nativen D-Typen akzeptieren:

In [97]: pd.isnull(np.array([np.nan, 0], dtype=float))
Out[97]: array([ True, False], dtype=bool)

In [98]: pd.isnull(np.array([np.nan, 0], dtype=object))
Out[98]: array([ True, False], dtype=bool)

Beachten Sie, dass dies Noneauch in Objektarrays als Nullwert betrachtet wird.


3
Danke - benutzte pd.isnull (). Scheint auch keine Auswirkungen auf die Leistung zu haben.
Tim654321

10

Ein großartiger Ersatz für np.isnan () und pd.isnull () ist

for i in range(0,a.shape[0]):
    if(a[i]!=a[i]):
       //do something here
       //a[i] is nan

da nur nan nicht gleich sich selbst ist.


Dies funktioniert möglicherweise nicht für Arrays, da der bekannte Wert "ValueError: Wahrheitswert eines xxx ist nicht eindeutig" ausgelöst wird.
MSeifert

@ MSeifert Sprechen Sie über Python ? Ich benutze diese Methode nur, um etwas beim maschinellen Lernen zu tun. Warum bin ich nicht auf den bekannten Fehler gestoßen?
Statham

Ja, anscheinend haben Sie noch nie Numpy oder Pandas benutzt. Verwenden import numpy as np; a = np.array([1,2,3, np.nan])Sie einfach Ihren Code und führen Sie ihn aus.
MSeifert

@ MSeifert er, ich bin neu in Numpy, aber der Code lief in Ordnung, kein Fehler passiert
Statham

In [1]: numpy als np importieren In [2]: a = np.array ([1,2,3, np.nan]) In [3]: a [1. 2. 3. nan] In [ 4]: drucke a [3] == a [3] False
Statham

10

Zusätzlich zur Antwort von @unutbu können Sie das Pandas-Numpy-Objekt-Array zum nativen Typ (float64) zwingen, etwas in der Richtung

import pandas as pd
pd.to_numeric(df['tester'], errors='coerce')

Geben Sie error = 'coerce' an, um zu erzwingen, dass Zeichenfolgen, die nicht auf einen numerischen Wert analysiert werden können, zu NaN werden. Der Spaltentyp wäre dtype: float64, und dann isnansollte die Prüfung funktionieren


Sein Name scheint zu sein unutbu;)
Dr_Zaszuś

@ Dr_Zaszuś Danke, behoben
Severin Pappadeux

0

Stellen Sie sicher, dass Sie eine CSV-Datei mit Pandas importieren

import pandas as pd

condition = pd.isnull(data[i][j])
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.