Python spark中null和NaN之间的差异?如何处理?

Python spark中null和NaN之间的差异?如何处理?,python,apache-spark,null,pyspark,nan,Python,Apache Spark,Null,Pyspark,Nan,在my DataFrame中,有分别包含null和NaN值的列,例如: df = spark.createDataFrame([(1, float('nan')), (None, 1.0)], ("a", "b")) df.show() +----+---+ | a| b| +----+---+ | 1|NaN| |null|1.0| +----+---+ 这两者有什么区别吗?如何处理它们?您可以使用函数isnan来区分NaN值,如本例所示 >>> df = sp

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

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

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

这两者有什么区别吗?如何处理它们?

您可以使用函数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的新值,也是数字类型

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

空值表示“无值”或“无”,它甚至不是空字符串或零。它可以用来表示没有任何有用的东西存在

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

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

df.na.drop()
或者,您可以将其更改为实际值(此处我使用了0),并使用:

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

df.where(col("a").isNull())
df.where(col("a").isNotNull())
也可以使用等效方法选择具有NaN的行:

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

您可以使用此代码处理它

df = df.where(pandas.notnull(df), None)
该代码将任何NaN值转换为null

下面是reffrence链接


谢谢,您能指出spark中两种类型的null和Nan的区别吗?我仍然不明白为什么spark退出这两种类型并不代表什么。我希望这能启发你的思维,你的问题非常有趣,因为理解和处理这种概念并不简单。尼斯:)我从@Shadio那里得到了完整的答案。谢谢这是一个完美答案的例子,很好:)谢谢,很高兴能帮上忙。:)但是当我计算
1.0/0.0
时,我得到的是
null
,而不是
NaN
。为什么?@PanChao:在不同的语言和类型中,被零除时会发生什么情况可能是不同的。例如,在scala
1.0/0.0
中,将是无穷大:
0.0/0.0
很可能会给您一个
NaN
df = df.where(pandas.notnull(df), None)