2
0

More than 1 year has passed since last update.

Pysparkのnull値の扱いと操作について

Last updated at Posted at 2022-02-10

本記事は、Pyspark操作時のnullの扱いや、nullに関わる関数の実行結果について、簡単にまとめたものとなっております。

0 データ準備

各操作では、以下のデータフレームを使用して行うものとする。
(データフレームの名前はdfとする。)

id item_name price
001 apple 100
002 banana 80
null orange 120
004 peach null

1 実行例

①nullを含む値の並び替え

Pysparkでは、sort()orderBy()の使用時、デフォルトの場合ではnullが先頭に来るように並び替えられる。

Pyspark
df1 = df.orderBy("id")
display(df1)

実行結果

id item_name price
null orange 120
001 apple 100
002 banana 80
004 peach null

nullが一番後ろに来るように並び替えたい場合には、
昇順 → asc_nulls_last()
降順 → desc_nulls_last()
を使用する。

Pyspark
from pyspark.sql.functions import col 

df2 = df.orderBy(col("id").asc_nulls_last())
display(df2)

実行結果

id item_name price
001 apple 100
002 banana 80
004 peach null
null orange 120

参考
pyspark.sql.DataFrame.orderBy
pyspark.sql.Column.asc_nulls_last
pyspark.sql.functions.desc_nulls_last

②nullを含む行の消去

dropna()を用いる事で、列内にnullが1つでも含まれている行の消去が可能である。

Pyspark
df1 = df.dropna()
display(df1)
id item_name price
001 apple 100
002 banana 80

またオプションとして、how='all'をつける事で、全ての値がnullである行を消去する事も可能である。
(今回の例のデータフレームではそのような行は存在しないため、そのままのデータが返される。)

詳しいオプションについては、以下のドキュメントを参照。

参考
pyspark.sql.DataFrame.dropna

③nullを含む行の抽出

isNull()を用いる事で、特定のカラムでnullを含む行のみを取り出すことが可能である。

Pyspark
df1 = df.filter(col("id").isNull())
display(df1)

実行結果

id item_name price
null orange 120

また、isNotNull()を用いる事で、nullを含まない行のみを取り出すことも可能である。

Pyspark
df2 = df.filter(col("id").isNotNull())
display(df2)

実行結果

id item_name price
001 apple 100
002 banana 80
004 peach null

参考
pyspark.sql.Column.isNull
pyspark.sql.Column.isNotNull

④nullの置き替え

fillna()を用いる事で、nullを別の値に置き替える事が可能である。

Pyspark
df1 = df.fillna('unknown')
display(df1)

実行結果

id item_name price
001 apple 100
002 banana 80
unknown orange 120
004 peach null

引数内のデータ型と一致するカラムのみが置き替えの対象となるため、id列のnullはunknownに置き換わるが、price列のnullは変化しない。

また、coalesce()を用いる事で、nullを別のカラムの値で置き替えることが可能である。

Pyspark
from pyspark.sql.functions import coalesce

df2 = df.select(coalesce(col("id"), col("item_name")))
display(df2)

実行結果

coalesce(id, item_name)
001
002
orange
004

上記の例では、id列内のnullについて、item_name列の同じ行の値(orange)に置き換えられている。

また下記の例のように、lit()を組み合わせる事で、nullを特定の固定値に設定し直す事も可能である。

Pyspark
from pyspark.sql.functions import lit

df3 = df.select(coalesce(col("id"), lit("unknown")))
display(df3)

実行結果

coalesce(id, item_name)
001
002
unknown
004

参考
pyspark.sql.DataFrame.fillna
pyspark.sql.functions.coalesce

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0