PySpark中查找并移除列值匹配错误的行
解决PySpark DataFrame中错误值行的过滤问题
你之前用isin()的思路完全走偏啦,isin()是用来判断列值是否属于某个固定集合的,而你要做的是对比两列的值是否相等,或者识别出Latitude列的非法值,所以得换个思路。
给你两种实用的解决方案:
方案1:直接过滤掉Latitude与Date值相同的行
既然错误行的Latitude完全等于Date的内容,直接对比两列即可:
from pyspark.sql import functions as F # 筛选出Latitude不等于Date的所有行 clean_df = df.filter(F.col("Latitude") != F.col("Date"))
为什么你之前的代码报错?因为df['Date'].isin(['Latitude'])是在检查Date列的值是否在['Latitude']这个字符串列表里,和你要的“Latitude是否等于Date”逻辑完全相反,而且PySpark里引用列要通过F.col()或者df["列名"]来操作,不能直接把列名当字符串传进去做跨列对比。
方案2:更通用的数值类型校验(推荐)
如果Latitude本来应该是数值型,不管错误值是不是和Date相同,只要不是合法数值都要过滤,那可以用try_cast()尝试转换类型,过滤转换失败的行:
# 尝试将Latitude转为Double类型,转换失败的会返回Null,我们保留非Null的行 clean_df = df.filter(F.try_cast(F.col("Latitude"), "Double").isNotNull())
这种方法适用性更广,比如如果Latitude出现其他非数值的错误值(比如字符串"NA"、"无效"等),也能一并过滤掉。
内容的提问来源于stack exchange,提问作者lengthy_preamble
相关产品推荐
相关产品推荐

