使用无值过滤Pyspark数据框列

Iva*_*van 76 python dataframe apache-spark apache-spark-sql pyspark

我正在尝试过滤具有None行值的PySpark数据帧:

df.select('dt_mvmt').distinct().collect()

[Row(dt_mvmt=u'2016-03-27'),
 Row(dt_mvmt=u'2016-03-28'),
 Row(dt_mvmt=u'2016-03-29'),
 Row(dt_mvmt=None),
 Row(dt_mvmt=u'2016-03-30'),
 Row(dt_mvmt=u'2016-03-31')]
Run Code Online (Sandbox Code Playgroud)

我可以使用字符串值正确过滤:

df[df.dt_mvmt == '2016-03-31']
# some results here
Run Code Online (Sandbox Code Playgroud)

但这失败了:

df[df.dt_mvmt == None].count()
0
df[df.dt_mvmt != None].count()
0
Run Code Online (Sandbox Code Playgroud)

但每个类别肯定都有价值观.这是怎么回事?

zer*_*323 153

你可以使用Column.isNull/ Column.isNotNull:

df.where(col("dt_mvmt").isNull())

df.where(col("dt_mvmt").isNotNull())
Run Code Online (Sandbox Code Playgroud)

如果您想简单地删除NULL可以na.dropsubset参数一起使用的值:

df.na.drop(subset=["dt_mvmt"])
Run Code Online (Sandbox Code Playgroud)

基于等同的比较NULL将不起作用,因为在SQL NULL中未定义,因此任何将其与另一个值进行比较的尝试都会返回NULL:

sqlContext.sql("SELECT NULL = NULL").show()
## +-------------+
## |(NULL = NULL)|
## +-------------+
## |         null|
## +-------------+


sqlContext.sql("SELECT NULL != NULL").show()
## +-------------------+
## |(NOT (NULL = NULL))|
## +-------------------+
## |               null|
## +-------------------+
Run Code Online (Sandbox Code Playgroud)

唯一有效的比较值的方法NULLIS//IS NOT等同于isNull/ isNotNull方法调用.

  • 太好了,谢谢.我认为PySpark数据帧上的这些过滤器会更"pythonic",但唉,它们不是.我正在考虑向开发者询问这个问题. (2认同)
  • 奇怪的是,这仅适用于字符串列...似乎`df.filter(“ dt_mvmt不为NULL”)`都可以处理。 (2认同)

Ant*_*ony 24

尝试使用isNotNull函数.

df.filter(df.dt_mvmt.isNotNull()).count()
Run Code Online (Sandbox Code Playgroud)


小智 10

要获取dt_mvmt列中的值不为null的条目,我们有

df.filter("dt_mvmt is not NULL")
Run Code Online (Sandbox Code Playgroud)

对于我们有空的条目

df.filter("dt_mvmt is NULL")
Run Code Online (Sandbox Code Playgroud)


小智 7

isNull()/isNotNull()将返回具有 Null 或 !Null 的相应行dt_mvmt

method_1 = df.filter(df['dt_mvmt'].isNotNull()).count()
method_2 = df.filter(df.dt_mvmt.isNotNull()).count()
Run Code Online (Sandbox Code Playgroud)

两者都会返回相同的结果


nee*_*ani 6

有多种方法可以从 DataFrame 的列中删除/过滤空值。

让我们使用以下代码创建一个简单的 DataFrame:

date = ['2016-03-27','2016-03-28','2016-03-29', None, '2016-03-30','2016-03-31']
df = spark.createDataFrame(date, StringType())
Run Code Online (Sandbox Code Playgroud)

现在您可以尝试以下方法之一来过滤掉空值。

# Approach - 1
df.filter("value is not null").show()

# Approach - 2
df.filter(col("value").isNotNull()).show()

# Approach - 3
df.filter(df["value"].isNotNull()).show()

# Approach - 4
df.filter(df.value.isNotNull()).show()

# Approach - 5
df.na.drop(subset=["value"]).show()

# Approach - 6
df.dropna(subset=["value"]).show()

# Note: You can also use where function instead of a filter.
Run Code Online (Sandbox Code Playgroud)

您还可以查看我博客上的“使用 NULL 值”部分以获取更多信息。

我希望它有帮助。