本記事は、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が先頭に来るように並び替えられる。
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()
を使用する。
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つでも含まれている行の消去が可能である。
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を含む行のみを取り出すことが可能である。
df1 = df.filter(col("id").isNull())
display(df1)
実行結果
| id | item_name | price |
|---|---|---|
| null | orange | 120 |
また、isNotNull()を用いる事で、nullを含まない行のみを取り出すことも可能である。
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を別の値に置き替える事が可能である。
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を別のカラムの値で置き替えることが可能である。
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を特定の固定値に設定し直す事も可能である。
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