値がNoneのPysparkデータフレーム列をフィルター処理する


98

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

文字列値で正しくフィルタリングできます:

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

しかし、これは失敗します:

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

しかし、各カテゴリーには確かに価値があります。どうしたの?


実際には、None値を持つ列ではなく、null値を持つ行をフィルタリングする必要があります。タイトルは誤解を招く可能性があります。
Atorpat

簡単に言えば、null(この場合はNone)を含む比較は常にfalseを返します。特に、比較(null == null)はfalseを返します。また、比較(None == None)はfalseを返します。
Richard Gomes

回答:


202

Column.isNull/ を使用できますColumn.isNotNull

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

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

単純にNULL値を削除したい場合はna.dropsubset引数とともに使用できます。

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

NULLSQLでは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メソッド呼び出しと同等です。


2
素晴らしいです、ありがとう。PySparkデータフレームのこれらのフィルターはより「パイソニック」になると思いましたが、残念ながらそうではありません。これについて開発者に質問することを考えています。
Ivan

1
実際にはかなりPythonicです。__eq__Noneでチェックしないでください;)is同じように動作しないため、機能しません。
zero323

2
奇妙なことに、これは文字列列に対してのみ機能します... df.filter("dt_mvmt is not NULL")両方を処理しているようです。
デビッドアレンブルク2017


14

dt_mvmt列の値がnullでないエントリを取得するには、

df.filter("dt_mvmt is not NULL")

nullのエントリには

df.filter("dt_mvmt is NULL")

2

Pandas syntexを使い続けたい場合は、これでうまくいきました。

df = df[df.dt_mvmt.isNotNull()]

1

column = Noneの場合

COLUMN_OLD_VALUE
----------------
None
1
None
100
20
------------------

データフレーム上でtemptableを作成します。

sqlContext.sql("select * from tempTable where column_old_value='None' ").show()

だから使用: column_old_value='None'


1

DataFrameの列からnull値を削除/フィルタリングする方法はいくつかあります。

以下のコードで簡単なDataFrameを作成しましょう:

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

これで、次のいずれかの方法でnull値を除外できます。

# 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.

詳細については、ブログの「NULL値の操作」セクションを確認することもできます。

お役に立てば幸いです。


0

PySparkは、算術、論理、およびその他の条件に基づいて、さまざまなフィルタリングオプションを提供します。NULL値が存在すると、それ以降のプロセスが妨げられる可能性があります。それらを削除するか、統計的に補完するかを選択できます。

以下のコードセットを検討できます。

# Dataset is df
# Column name is dt_mvmt
# Before filtering make sure you have the right count of the dataset
df.count() # Some number

# Filter here
df = df.filter(df.dt_mvmt.isNotNull())

# Check the count to ensure there are NULL values present (This is important when dealing with large dataset)
df.count() # Count should be reduced if NULL values are present


0

列の値がNoneのレコードをフィルターで除外する場合は、以下の例を参照してください。

df=spark.createDataFrame([[123,"abc"],[234,"fre"],[345,None]],["a","b"])

次に、null値のレコードを除外します。

df=df.filter(df.b.isNotNull())

df.show()

これらのレコードをDFから削除する場合は、以下を参照してください。

df1=df.na.drop(subset=['b'])

df1.show()

0

None / Nullはpyspark / pythonのNoneTypeクラスのデータ型なので、NoneTypeオブジェクトを文字列オブジェクトと比較しようとしているため、以下は機能しません。

間違った方法のフィレット

df [df.dt_mvmt ==なし] .count()0 df [df.dt_mvmt!=なし] .count()0

正しい

df = df.where(col( "dt_mvmt")。isNotNull())は、dt_mvmtがNone / Nullであるすべてのレコードを返します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.