【Python】データフレームの欠損値を削除する

Python

本記事では、Pythonのライブラリ、Pandasのデータフレーム内の欠損値削除について解説します。
データ分析に付き物の欠損値ですが、欠損値の取り扱いは非常に奥が深いものになっています。考え方として、画一的な処理はなるべく避けるべきですが、今回は「欠損値の削除」という作業自体について取り扱います。

また、本記事はPythonのデータフレームの取り扱いにまだ慣れていない方向けに、とりあえず動くコードを紹介いたします。
上級者の方のアドバイスを頂けますと幸いです。

該当コード

まずはデータの読み込み(架空のデータです)

import pandas as pd

df = pd.read_csv('data.csv')

基本的な使い方

# 行の削除
df_row = df.dropna(axis=0)

# 列の削除
df_column = df.dropna(axis=1)

どこに欠損値があるかで、削除するかどうかを変える場合

# subsetを使用する

# column1に欠損がある行を削除する
df_subset1 = df.dropna(subset=['column1'])

# 複数指定することも可能
df_subset2 = df.dropna(subset=['column1','column2'])

# axis=1などを組み合わせることで指定行に欠損値が含まれる列を削除することもできる
# が、用途が不明なため説明は割愛

どれくらい欠損があるかで削除するかどうかを変える場合

# howを使用する
df_how_any = df.dropna(how='any') # デフォルトなためdf.dropna()と同義
df_how_all = df.dropna(how='all') # 全てが欠損値の場合、削除される

# threshを使用する
df_thresh = df.dropna(thresh=4) # 整数(int)で指定する
# 詳しい内容は以下の解説をご覧ください。

解説

欠損値を削除する前に、列か行、どちらに対して欠損値を削除するかを考えます。
データ分析の性質上、欠損を含むからと言って、列を削除するのはあまり得策ではないような気がしますので、「欠損値を含む行を削除」が一番行われる処理かなと思います。

基本的な使い方では、欠損値が列もしくは行に含まれている場合、削除されます。そのため、この方法で欠損値を削除する場合は、どこに欠損値が含まれているかは必ず確認しましょう。

二つ目のコードでは、欠損値の判断をする列名を指定して、欠損のある行を削除するパターン。一番このパターンを分析実務では使用します。
「この列にデータがないなら、使えない」という場合には、この処理です。


三つ目のhow=’any’ or ‘all’ですが、私自身はあまり使わないです。使い方もほぼそのまま。anyを使用する場面で、subsetの指定列が多すぎたりすると、どこが欠損だから削除されているのかが曖昧になります。説明性の観点から避けるべき処理であると考えられます。大規模な処理で実行速度が重視されないような場合は、可読性を優先するべきです。(個人的意見)

また、threshですが、私は分析実務で使用したことがありません。欠損値の削除は慎重に行われるべきと考えているので、定量的な判断は基本的にしません。そのため、使用したことがありません。
解説としては、thresh=4と指定した時に欠損値でない要素が4つ以上含まれている行が残ります。欠損値削除の観点から言い直すと、指定した数値(今回は4)より少ない個数しか埋まっていない場合に、その行は削除されます。つまり、今回の例でいくと、6列のデータに対して欠損が欠損が3つ以上ある場合は削除されます。
threshについては、実際に実行して確かめてみてください!

また、これらの引数を組み合わせることで、複雑な条件での欠損値削除を一つの処理で行うこともできます。

とはいえ、実際に実行結果を確認しながら処理した方が良いので、探索的に行う場合は、1行1行書いても良いと思います。私はそうします。

公式リファレンス

公式リファレンスは以下からどうぞ

pandas.DataFrame.dropna — pandas 2.1.4 documentation

参照したサイト

安定のnkmk

pandasで欠損値NaNを削除(除外)するdropna | note.nkmk.me
pandas.DataFrame, Seriesの欠損値NaNを削除(除外)するにはdropna()メソッドを使う。pandas.DataFrame.dropna — pandas 2.0.3 documentation pandas.Series.dropna — pandas 2.0.3 documentation...
【pandas】DataFrameでNaNの行列を削除する方法(dropnaの使い方まとめ)
Pythonのpandasでdropnaの使い方を解説。列名や行名を指定して削除する方法や消えないときはinplaceを使うなどを書いています。

まとめ

以上となります。欠損値の削除という処理としてはシンプルなものですが、場合分けをしていくと非常に複雑多岐にわたります。

意外と、「axis=1って列と行どっちだっけ」と言うことは良くあるので、都度立ち返りつつ、自分に染み込ませていくと良いと思います!
私はこんな感じで記事を書いたりして、定着と理解、さらに知らなかったこと(今回だとthresh!)などの幅を広げています。

本記事での情報が読んでいただいた皆様のお役に立てれば幸いです。ここまで読んでいただきありがとうございました。

データサイエンティストの書評ブログ
趣味が読書くらいしかない駆け出しデータサイエンティストの書評ブログです。日々の勉強のアウトプットや趣味の読書のおすすめをしていきます。

転職・スキルアップはこちらからどうぞ

オススメ転職はこちらからどうぞ
オススメのスキルアップはこちらからどうぞ

コメント

タイトルとURLをコピーしました