我使用pandas readcsv()
阅读csv文件的两列,然后将值分配给字典。列包含数字和字母的字符串。有时候会出现单元格为空的情况。在我看来,读取到该字典条目的值应该是None
,但却分配了nan
。当然,None
更能描述一个空单元格,因为它有一个null值,而nan
只是说读取的值不是一个数字。
请问None
和nan
有什么区别?为什么分配的是nan
而不是None
?
此外,我的字典检查任何空单元格一直使用numpy.isnan()
:
for k, v in my_dict.iteritems():
if np.isnan(v):
字符串
但是这给了我一个错误,说我不能对v
使用这个检查。我猜这是因为一个整数或浮点变量,而不是一个字符串是要使用的。如果这是真的,我如何检查v
的“空单元格”/nan
情况?
4条答案
按热度按时间dba5bblo1#
NaN在pandas中被用作丢失数据的占位符 * 一致性 ,一致性很好。我通常读/翻译NaN为*“失踪”**。* 另请参阅文档中的'working with missing data'部分。*
Wes在文档“NA代表的选择”中写道:
经过多年的生产使用,至少在我看来,考虑到NumPy和Python的总体状况,[NaN]已经被证明是最好的决定。特殊值NaN(Not-A-Number)被用作NA值,并且有API函数
isna
和notna
可以跨数据类型使用来检测NA值。...
因此,我选择了Pythonic的“实用性胜过纯粹性”方法,并将整数NA功能换成了一种更简单的方法,即在浮点数和对象数组中使用特殊值来表示NA,并在必须引入NA时将整数数组提升为浮点数。
在我看来,使用NaN(而不是None)的主要原因是它可以用numpy的float 64 dtype存储,而不是效率较低的对象dtype,* 参见NA类型提升 *。
字符串
Jeff对此评论如下:
np.nan
允许向量化操作;它是一个浮点值,而None
,根据定义,强制对象类型,这基本上禁用了numpy中的所有效率。快速重复3次:object==bad,float==good
也就是说,许多操作可能仍然可以与None和NaN一样工作(但可能不支持,即他们有时会给予surprising results):
型
回答第二个问题:
您应该使用
isna
和notna
来测试缺失数据(NaN)。k4aesqcs2#
NaN
可以在数学运算中用作数值,而None
不能(或者至少不应该)。NaN
是一个数值,如IEEE 754 floating-point standard中所定义。None
是一个内部Python类型(NoneType
),在这种情况下更像是“不存在”或“空”,而不是“数字无效”。主要的“症状”是,如果你对一个包含NaN的数组执行平均或求和,即使是一个数组,结果也会得到NaN...
另一方面,不能使用
None
作为操作数执行数学运算。因此,根据具体情况,您可以使用
None
作为一种方式来告诉您的算法在计算时不要考虑无效或不存在的值。这意味着算法应该测试每个值,看看它是否是None
。Numpy有一些函数可以避免NaN值污染结果,例如
nansum
和nan_to_num
。piztneat3#
函数
isnan()
检查某个变量是否为“Not A Number”,并返回变量是否为数字,例如isnan(2)
返回false条件
myVar is not None
返回变量是否已定义numpy数组使用
isnan()
,因为它是一个数字数组,它将数组的所有元素初始化为NaN
,这些元素被认为是“空”6uxekuva4#
以下是差异:
nan
属于float
类None
属于NoneType
类我发现下面的文章很有帮助:https://medium.com/analytics-vidhya/dealing-with-missing-values-nan-and-none-in-python-6fc9b8fb4f31