2016-06-20 5 views
4

vermisse ich etwas oder haben wir ein problem mit pandas.isnull()?pandas.isnull() arbeitet nicht am Dezimaltyp?

>>> import pandas as pd 
>>> import decimal 
>>> d = decimal.Decimal('NaN') 
>>> d 
Decimal('NaN') 
>>> pd.isnull(d) 
False 
>>> f = float('NaN') 
>>> f 
nan 
>>> pd.isnull(f) 
True 
>>> pd.isnull(float(d)) 
True 

Problem ist ich einen Datenrahmen mit decimal.Decimal Werte in ihm haben, und df.dropna() nicht entfernt NaN aus diesem Grund ...

Antwort

4

Ja, das nicht unterstützt wird, Sie können die Eigenschaft, dass NaN nicht selbst gleich welcher für Decimal Typen funktioniert immer noch:

In [20]: 
import pandas as pd 
import decimal 
d = decimal.Decimal('NaN') 
df = pd.DataFrame({'a':[d]}) 
df 

Out[20]: 
    a 
0 NaN 

In [21]:  
df['a'].apply(lambda x: x != x) 

Out[21]: 
0 True 
Name: a, dtype: bool 

So können Sie tun:

In [26]: 
df = pd.DataFrame({'a':[d,1,2,3]}) 
df[df['a'].apply(lambda x: x == x)] 

Out[26]: 
    a 
1 1 
2 2 
3 3 
+0

Ihre Lösung ist großartig, dezimal zu halten. Dezimalwerte, aber ich denke, es wird einfacher für mich, all diese Sachen in float64 zu konvertieren. – comte

+1

Ich schlage vor, 'dtype's zu verwenden, die' numpy' kompatibel sind, da es Ihnen das Leben leichter macht, da Sie keine Überraschungen bekommen. – EdChum

+0

Ich möchte auch hinzufügen, dass dieses Problem bei der Verwendung von df.dropna() auftritt. in Python 3.x. Ich bestätige, dass die Lösung von EdChum funktioniert. –