火花中的零和NaN之间的区别?如何处理它



在我的数据帧中,有一些列分别包含 null 和 NaN 的值,例如:

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

它们之间有什么区别吗?如何处理它们?

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

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

处理值的一种可能方法是通过以下方式删除它们:

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")))

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

None用于空,没有元素,甚至更抽象,因为在数字类型中,除了de NaN值外,您还有None值。None 值存在于所有类型的所有值集中

您可以使用此代码处理它

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

该代码会将任何 NaN 值转换为空

以下是参考链接

链接

我有不同的想法也许您可以将 nan 或 null 更改为另一个值,如下所示:

xxDf.withColumn("xxColumn", when(col("xxColumn").isNull, "xxx")).when(col("xxColumn").isNan, "xxx")).otherwise(col("xxColumn")))

相关内容

  • 没有找到相关文章

最新更新