業務の中で新しいデータソースからデータマートを作成することがあったのですが、その前段としてそのテーブルにどのような状態でデータが格納されているか調査することになりました。
Pysparkで各列の欠損値をカウントしたかったのですが、pandasみたいに簡単にできる方法が調べてもパッと出てこず、toPandas()で変換しようにもデータ量が多くて変換できなかったので、別の方法でカウントした方法をご紹介します。
pandasで各列の欠損値の個数をカウント
まずは、用意したcsvを読み込む。
csvの内容は以下。”user_id”以外の部分にランダムで欠損値を作成したものになっています。
pandasで欠損値を数えた結果がこちら
isnull()は、値が欠損していればTrue、欠損していなければFalseを返します。
そして、sum()ではTrue=1,False=0として処理されるためsum()でそれをカウントしています。
Pysparkで各列の欠損値の個数をカウント
先ほどと同じcsvを読み込みます。
Pysparkでカウントした方法がこちら
他にもっと良い方法があったのかもしれないですが、とりあえずこれでカウントしました。
リスト内包表記で「カラムにnullがある場合数える」という形でカウントしています。
実際の業務でもtoPandas()が使えないデータ量でも早く処理して結果を返してくれたので、まぁこれで良しとしました。
また、nullではなくてブランクの数や欠損率を出力したい時はwhenの中の条件を変えてあげれば出力されます。
ちなみに業務では同じ要領で各列の最大と最小文字数も確認しました。
何でそのような確認をしたかというとデータの値の前後に余計な空白が入っていないか確認するためです。
上の方でcsvを単純に出力した結果を見てみると、見た目では”user_id”が8文字無い箇所もありますが、出力結果を見ると”user_id”のmaxとminのlengthが8になっています。
これは、csvを作成する段階でブランクを入れておいたからです。
空白が入っているまま他のテーブルとjoinすると、思うような抽出ができないことになってしまうので、こういう調査もしました。
以上がDataframeから各列の欠損値の総数をカウントする方法になります。参考になれば幸いです。