Pyspark:数据框有一个 float 类型的薪水列和一些 NaN 值,同时过滤掉薪水 NaN 值也出现在最终输出中

问题描述 投票:0回答:2

在工资列上使用过滤方法,我得到了 NaN 值;据我所知,NaN 值不应该出现在输出数据框中。我还从 ChatGPT 询问过,它显示我没有 NaN 值。当询问输出差异时,它说可能是由于版本不匹配,但事实并非如此。顺便说一句,我正在使用

Spark v3.3.2

users = {
    'name': ['John', 'Jane', 'Mike'],
    'salary': [400.0, None, 200.0]
}

pdf = pd.DataFrame(users)
sdf = spark.createDataFrame(pdf)


# filter out the rows with salaries greater than 300
sdf_filtered = sdf.filter(sdf.salary > 300)
sdf_filtered.show()

我的输出

+----+------+
|name|salary|
+----+------+
|John| 400.0|
|Jane|   NaN|
+----+------+

ChatGPT 显示给我(版本 v3.2)

+------+
|salary|
+------+
| 400.0|
+------+

我认为 ChatGPT 在这里没有产生正确的输出,或者我的输出是错误的。

apache-spark pyspark apache-spark-sql filtering nan
2个回答
0
投票

这个问题的最终答案在文档中。

Null
与任何其他操作数的比较将返回 Null,而在 pandas 中,执行比较时默认情况下会删除 NaN。所以这是预期的输出:

+----+------+
|name|salary|
+----+------+
|John| 400.0|
|Jane|   NaN|
+----+------+

0
投票

因为构造Nan属于类

float
,也代表了一个缺失值,所以在对
salary > 300
进行过滤时,spark会发现NaN值是数值类型(float),也是缺失的,所以他是不确定它是否大于 300(未定义的值),所以他不会为你做出决定并会保留该值,如果你想删除 NaN,你可以用你的查询过滤掉它们:

sdf_filtered = sdf.filter(~isnan(sdf.salary) & (sdf.salary > 300))

对于 ChatGPT 部分,我什至不会考虑它的答案,因为已经证明它会给出错误的结果。

© www.soinside.com 2019 - 2024. All rights reserved.