在我的数据帧中,有一些列分别包含 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")))