2013-07-08 118 views
50

我正在使用pandas​​读取csv文件的两列,然后将值分配给字典。这些列包含数字和字母串。偶尔有些情况下单元格是空的。在我看来,读入该字典条目的值应该是None,而不是nan已分配。当然None更具描述性,因为它有一个空值,而nan只是说读取的值不是数字。NaN和None有什么区别?

我的理解是否正确,Nonenan有什么区别?为什么分配nan而不是None

而且,我对任何空单元字典检查已使用numpy.isnan()

for k, v in my_dict.iteritems(): 
    if np.isnan(v): 

但是,这给了我一个错误说我不能使用该支票v。我想这是因为一个整数或浮点变量,而不是一个字符串是为了使用。如果这是真的,我该如何检查v“空单元”/ nan的情况?

+0

文本'qwerty'不是数字。 –

+1

@RobertHarvey我知道,所以肯定'None'将是个空单元格的值的更好的描述。 – user1083734

+0

@ user1083734我的回答描述 – Stephan

回答

49

NaN被用作占位符missing data consistently in pandas,一致性好。我经常读/翻译为NaN “失踪”另请参阅文档中的'working with missing data'部分。

韦斯写在docs 'choice of NA-representation'

经过多年的生产使用[NaN的]已经证明,至少在我看来,是给定事务中与NumPy和Python在状态最好的决定一般。特殊值NaN(非-A-数)用于到处作为NA值,并有可跨越dtypes被用于检测NA值的API函数isnullnotnull
...
因此,我选择了Pythonic“实用性节拍纯度”方法和交易整数NA能力,这是一种使用float和object数组中的特殊值来表示NA并将整数数组提升为浮点的简单方法当必须引入新辅助器时。

注:"gotcha" that integer Series containing missing data are upcast to floats

在我看来最主要的原因使用的NaN(在无)是,它可以存储与numpy的的float64 D型,而不是低效率的对象D型,看到NA type promotions

# without forcing dtype it changes None to NaN! 
s_bad = pd.Series([1, None], dtype=object) 
s_good = pd.Series([1, np.nan]) 

In [13]: s_bad.dtype 
Out[13]: dtype('O') 

In [14]: s_good.dtype 
Out[14]: dtype('float64') 

杰夫意见(下)在此:

np.nan允许矢量化操作;它的浮点值,而None,根据定义,强制对象类型,它基本上禁用numpy的所有效率。

如此重复3次快速:对象==坏,浮==好

话说,许多操作可能仍然无VS NaN的工作一样好(但也许是不支持即它们可能有时会给surprising results):

In [15]: s_bad.sum() 
Out[15]: 1 

In [16]: s_good.sum() 
Out[16]: 1.0 

要回答的第二个问题:
你应该使用pd.isnullpd.notnull测试丢失的数据(NAN)。

+9

只需在这里添加2c ....''np.nan''允许矢量化操作;它是一个浮点值,而''None''由定义强制''object''类型,并且基本上禁止了numpy中的所有效率,所以重复快3次:''object == bad,float == good'' – Jeff

+0

另外:http://stackoverflow.com/a/19866269/1240268 –

-2

NaN支付非数字
None可能代表任意

2

isnan()检查,看看是否有是“非数字”,将返回一个变量是否为一个号码的功能,例如isnan(2)将返回false

有条件myVar is not None返回变量是否是定义

你numpy的阵列使用isnan(),因为它意在是数字数组,它在阵列中的所有元素初始化为NaN这些元素被认为是“空”

+1

我认为'isnan(2)'会返回'False',因为2不是NaN。 – heltonbiker

+0

另外,'numpy.empty'不会将数组值初始化为'NaN'。它根本不会初始化这些值。 – heltonbiker

+0

@heltonbiker idk我在想什么 – Stephan

7

NaN可以用作数学运算的数值,而None不能(或者至少不应该))。

NaN是数字值,如在IEEE 754 floating-point standard中定义的。 None是一个内部Python tipe(NoneType),在这种情况下更像是“不存在”或“空白”而不是“数字无效”。

主要“症状”那是,如果你执行,也就是说,包含NaN的,甚至一个一个阵列上的平均或总和,你会得到NaN的结果...

在另一方面,您不能使用None作为操作数执行数学运算。

因此,根据具体情况,可以使用None作为告诉算法不要在计算时考虑无效或不存在的值的方法。这意味着算法应该测试每个值,看它是否是None

Numpy有一些功能可以避免NaN值污染您的结果,例如nansumnan_to_num

+0

我同意你没有应该用于不存在的条目,那么为什么'df = pd.readcsv('file.csv')'为空单元赋予'NaN'值而不是'None'?据我所知,pd.DataFrames不是数字唯一的。 – user1083734

+0

好吧,这可能是一个设计选择。我猜想DataFrames和Series有一个'dtype',所以'dtype = float'的无效值必须用数值​​表示,其中'NaN'和None都不是('None'是'NoneType')。 – heltonbiker

+0

此外,很多Pandas方法都有一个'na'参数,它让你决定使用哪个值来替换不可用的值 – heltonbiker