Effizient prüfen, ob ein beliebiges Objekt in Python / numpy / pandas NaN ist?

101

Meine Numpy-Arrays kennzeichnen np.nanfehlende Werte. Während ich den Datensatz durchlaufe, muss ich solche fehlenden Werte erkennen und auf besondere Weise behandeln.

Naiv habe ich verwendet numpy.isnan(val), was gut funktioniert, es valsei denn, es gehört nicht zu der Untergruppe der von unterstützten Typen numpy.isnan(). Zum Beispiel können fehlende Daten in Zeichenfolgenfeldern auftreten. In diesem Fall erhalte ich:

>>> np.isnan('some_string')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Not implemented for this type

Gibt Falsees eine Möglichkeit, dies elegant und effizient zu handhaben, außer einen teuren Wrapper zu schreiben, der die Ausnahme abfängt und zurückgibt ?

Dun Peal
quelle
8
pandashat pandas.isnull(): Ich bin nicht sicher, ob das Ihren Anforderungen entspricht, daher könnten einige Beispieldaten gut sein.
Marius
4
@Marius: pandas.isnull()scheint perfekt zu funktionieren. Der einzige Datentyp, mit dem ich mich derzeit befasse, numpy.isnan()ist ein String, der gut damit pandas.isnull()umgeht. Tatsächlich scheint es mit jedem beliebigen Objekt, das ich darauf geworfen habe, gut umzugehen. Gab es spezielle Probleme, über die Sie besorgt waren? Andernfalls möchten Sie Ihren Kommentar möglicherweise als vollständige Antwort einreichen, da dies zumindest für Pandas-Benutzer wie eine kanonische Antwort erscheint.
Dun Peal

Antworten:

169

pandas.isnull()(auch pd.isna()in neueren Versionen) prüft auf fehlende Werte sowohl in numerischen als auch in String / Objekt-Arrays. In der Dokumentation wird nach Folgendem gesucht:

NaN in numerischen Arrays, None / NaN in Objektarrays

Kurzes Beispiel:

import pandas as pd
import numpy as np
s = pd.Series(['apple', np.nan, 'banana'])
pd.isnull(s)
Out[9]: 
0    False
1     True
2    False
dtype: bool

Die Idee numpy.nan, fehlende Werte darzustellen, wurde pandaseingeführt, weshalb pandasdie Werkzeuge vorhanden sind, um damit umzugehen.

Datumszeiten auch (wenn Sie verwenden, müssen pd.NaTSie den dtype nicht angeben)

In [24]: s = Series([Timestamp('20130101'),np.nan,Timestamp('20130102 9:30')],dtype='M8[ns]')

In [25]: s
Out[25]: 
0   2013-01-01 00:00:00
1                   NaT
2   2013-01-02 09:30:00
dtype: datetime64[ns]``

In [26]: pd.isnull(s)
Out[26]: 
0    False
1     True
2    False
dtype: bool
Marius
quelle
19

Ist Ihr Typ wirklich willkürlich? Wenn Sie wissen, dass es sich nur um einen int float oder einen String handelt, können Sie dies einfach tun

 if val.dtype == float and np.isnan(val):

Angenommen, es ist in Numpy gehüllt, hat es immer einen d-Typ und nur float und complex können NaN sein

Hammer
quelle
Ich habe es mit vielen verschiedenen Arten von Daten zu tun. Während die meisten Spalten int * oder float * -Datentypen haben, können andere beliebige Objekte sein, obwohl der einzige andere Typ, den ich verwendet habe, Zeichenfolge war.
Dun Peal
Strings in Python hat nicht dtype. Möglicherweise müssen Sie tuntype(val) == 'float'
pvarma
4
type(val) == float and np.isnan(val)- arbeitete für mich
Danny Cullen
@ user1930402 Ich gehe davon aus, dass dies numpy Arrays sind, keine regulären Python-Arrays. Zum Beispiel: np.array (["Hallo"]) [0] .dtype funktioniert, aber ["Hallo"] [0] .dtype nicht
Hammer