火花中null和NaN之间的差异?怎么处理呢?

时间:2017-05-10 02:33:22

标签: python apache-spark null pyspark nan

在我的DataFrame中,有些列分别包含null和NaN的值,例如:

df = spark.createDataFrame([(1, float('nan')), (None, 1.0)], ("a", "b"))
df.show()

+----+---+
|   a|  b|
+----+---+
|   1|NaN|
|null|1.0|
+----+---+

这些之间有什么区别吗?他们怎么处理?

3 个答案:

答案 0 :(得分:17)

null 值表示"没有值"或者"没有",它甚至不是空字符串或零。它可以用来表示没有任何有用的东西。

NaN代表"不是数字",它通常是数学运算的结果,没有意义,例如0.0/0.0

处理 null 值的一种可能方法是使用以下命令删除它们:

df.na.drop()

或者您可以将它们更改为实际值(此处我使用0):

df.na.fill(0)

另一种方法是选择特定列 null 的行进行进一步处理:

df.where(col("a").isNull())
df.where(col("a").isNotNull())

也可以使用等效方法选择带NaN的行:

from pyspark.sql.functions import isnan
df.where(isnan(col("a")))

答案 1 :(得分:2)

您可以使用函数isnan来区分您的NaN值,如此示例

>>> df = spark.createDataFrame([(1.0, float('nan')), (float('nan'), 2.0)], ("a", "b"))
>>> df.select(isnan("a").alias("r1"), isnan(df.a).alias("r2")).collect()
[Row(r1=False, r2=False), Row(r1=True, r2=True)]

差异在于产生价值的对象的类型。 NaN(不是数字)是处理数字"无值的旧时尚方式,你可以认为你拥有所有数字(-1-2 ... 0,1,2 ...)并且需要有额外的值,对于错误的情况(例如,1/0),我希望1/0给我一个数字,但是数字?好吧,就像1/0的数字一样,它们会创建一个名为NaN的新值,它的类型也是数字。

无用于void,缺少元素,甚至更抽象,因为在数字类型中,除了de NaN值之外,还有None值。 所有类型的所有值集中都存在None值

答案 2 :(得分:2)

您可以使用此代码处理它

df = df.where(pandas.notnull(df), None)

该代码会将所有NaN值转换为空

下面是参考链接

Link