1. ホーム
  2. python

[解決済み] Pysparkのデータフレーム列をNone値でフィルタリングする

2022-05-04 15:08:53

質問

PySparkのデータフレームにフィルタリングをかけようとしています。 None を行の値として使用します。

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')]

で、文字列の値で正しくフィルタリングすることができます。

df[df.dt_mvmt == '2016-03-31']
# some results here

が、これは失敗です。

df[df.dt_mvmt == None].count()
0
df[df.dt_mvmt != None].count()
0

しかし、各カテゴリーには確かに値があるのです。どうなっているんだ?

解決方法は?

を使用することができます。 Column.isNull / Column.isNotNull :

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

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

を単純に削除したい場合 NULL を使用することができます。 na.drop と共に subset 引数で指定します。

df.na.drop(subset=["dt_mvmt"])

との等価比較 NULL が動作しないのは、SQL では NULL は未定義なので、他の値と比較しようとすると NULL :

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


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

と値を比較する唯一の有効な方法です。 NULLIS / IS NOT と等価である。 isNull / isNotNull メソッドを呼び出します。