Pythonデータ分析における欠損値の扱い方8つの方法を解説
今回は、欠損値問題を解決するための8つの方法を取り上げます。どの方法が最適かは、データとタスクによって異なります。技術交流のために、この記事の最後にグループを追加して、自由に収集と学習、「いいね!」と「サポート」をしてください。
まず、サンプルのデータフレームを作成し、そこにいくつかの欠損値を追加することから始めましょう。
10行6列のデータボックスがあります。
次に、欠損値を追加します。locメソッドを使って行と列の組み合わせを選択し、標準的な欠損値表現の1つである"np.nan"に等しくすることにします。
現在のデータフレームはこのようになっています。
項目とメジャー1列は整数値ですが、値がないため浮動小数点数にアップコンバートされています。
Pandas 1.0 では、整数型に対する欠損値表現 () が導入されたので、整数型カラムに欠損値を含めることも可能です。しかし、明示的にデータ型を宣言する必要があります。
値が欠落しているにもかかわらず、整数列を維持できるようになりました。
これで、欠損値のあるデータボックスができました。ここで、欠損値を処理するさまざまな方法を見てみましょう。
1. 欠損値のある行または列を削除する
欠測値を含む行や列を削除するのも一つの方法です。
デフォルトのパラメータ値を使用して、dropna関数は、任意の欠損値を含む行を削除します。データフレームには、欠損値を含まない行が1つだけあります。また、axisパラメータを使用して、少なくとも1つの欠損値を持つ列を削除するオプションもあります。
2. 欠損値のみの行または列の削除
もう一つの状況は、欠損値でいっぱいの列や行がある場合です。そのような列や行は役に立たないので、削除すればよいのです。
このような場合にもdropna関数が利用できます。howパラメータの値を変更するだけです。
3. 閾値に基づく行または列の削除
any"や"all"に基づいて削除することは、常に最良の選択肢とは限りません。多くの値が欠落している行や列を削除する必要がある場合があります。
このような式をhowパラメータに代入することはできませんが、Pandasはthreshパラメータでより正確な方法を提供してくれています。
例えば、"thresh=4"は、少なくとも4つの値が欠落していない行が保持されることを意味します。残りは破棄されます。
このデータフレームは6列なので、3つ以上の欠損値を持つ行は削除されます。
3行目だけ欠損値が2つ以上あるので、それだけが破棄されます。
4. 特定のカラムのサブセットに基づいて削除する
カラムを削除する場合、カラムのサブセットのみを考慮することができる。
この作業には、dropna関数のパラメータのサブセットが使用されます。例えば、以下のように、Metric 1またはMetric 2の列に欠損値がある行を削除することができる。
これまで、欠損値に基づいて行や列を削除するさまざまな方法について見てきました。削除は唯一の選択肢ではありません。場合によっては、削除するのではなく、欠損値を埋めることを選択することもあります。
実際、データには価値があるのだから、水増ししたほうがいい場合もある。もちろん、欠損値をどのように埋めるかは、データの構造とタスクに依存する。
欠損値を埋めるには、fillna関数を使用します。
5. 定数値を埋める
欠損値を置き換えるために、定数値を選ぶことができます。fillna関数に定数値だけを与えると、データボックス内のすべての欠損値をその値で置き換えます。
より合理的な方法としては、異なる列に対して個別の定数値を特定することです。それらを辞書に書き込んで、valuesパラメータに渡せばよいのです。
項目欄の欠損値を1014に、小節1欄の欠損値を0に置き換えています。
6. 集計値の入力
また、平均値、中央値、複数値などの集計値を使用する方法もある。
次のコード行は、2列目の欠損値をその列の平均値に置き換えるものである。
7. 前の値または次の値に置き換える
列の欠損値を列の前の値または次の値に置き換えることができます。この方法は、時系列データを扱うときに便利かもしれません。毎日の気温の測定値を含むデータフレームがあり、ある日の気温帯が欠落しているとします。最良の解決策は、翌日または前日の気温を使うことです。
この作業を行うには、fillna関数のmethod引数を使用します。
"bfill"は、次の値に置き換えることができるように、欠損値を後方から埋めます。最後の列を見てください。最初の行で欠落した値が置換されています。これは場合によってはうまくいかないかもしれません。
ありがたいことに、この方法で置き換えることができる欠損値の数を制限することができます。limitパラメータを1に設定すると、欠落した値はその次の値でしか置き換えられなくなります。2つ目、3つ目の値は置き換えに使われません。
8. 別のデータフレームで埋める
また、fillna関数に別のデータフレームを渡すこともできます。新しいデータフレーム内の値は、現在のデータフレーム内の欠損値を置き換えるために使用されます。
値は、行インデックスと列名に基づいて選択されます。例えば、項目列の2行目に欠損値がある場合、新しいデータフレーム内の同じ位置の値が使用されます。
上の図は、同じ列を持つ2つのデータボックスです。1つ目のデータボックスには、欠損値がありません。
以下のようにfillna関数を使用することができます。
dfの値は、列名と行インデックスをdf2の値に置き換えます。
要約
私たちの生活には欠席がつきものです。欠席に対処する最善の方法はありませんが、正確で賢明な方法を適用することで、その影響を軽減することができます。欠損値を扱う8つの異なる方法を説明しましたが、どれを使うかはデータとタスクに依存します。
テクニカルコミュニケーション
転載、ブックマーク、応援など、ご自由にどうぞ。
Pythonデータ解析の記事は以上となります。欠損値を扱う8つの方法、Pythonデータ解析の詳細については、Script Houseの過去の記事を検索するか、以下の記事を引き続きご覧ください。
関連
-
[解決済み】 AttributeError: モジュール 'matplotlib' には属性 'plot' がない。
-
[解決済み】LockとRLockの違いは何ですか?
-
python-DataFrame-Error: ValueError: DataFrame のコンストラクタが正しく呼び出されていない!
-
python TypeError: Unicode オブジェクトはハッシュ化する前にエンコードする必要がある 解決策
-
初めてのPygameプログラムの作り方
-
[解決済み] Python TypeError: フォーマット文字列の引数が足りない
-
[解決済み] Python MySQLdb の問題 (TypeError: %d format: 数値が必要で、str ではありません)
-
[解決済み] Pandas merge が "Buffer has wrong number of dimensions (expected 1, got 2)" というエラーを出す。
-
[解決済み] popメソッド(またはdel文)を持つforループがすべてのリスト要素に対して反復処理を行わない理由
-
[解決済み] OpenCV 3.1.0 with Python 3.5 の `CV_HAAR_SCALE_IMAGE` はどこにあるのでしょうか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
pythonを使ったオフィス自動化コード例
-
[解決済み】 TypeError: 'builtin_function_or_method' オブジェクトに '__getitem__' 属性がない。
-
[解決済み】なぜnum = 100になるのですか?
-
runtimewarning: 割り算で無効な値が発生しました。
-
[解決済み] NumPyの配列を切り詰めずに、完全に表示するにはどうしたらよいですか?
-
[解決済み] Pythonです。DeprecationWarning: エレメント単位の == 比較に失敗しました; これは将来的にエラーになります。
-
[解決済み] GPU Sync Failed While using tensorflow(テンソルフロー使用中にGPU同期に失敗した
-
[Python】PandasのDataFrame基本関数 (full)
-
TypeError: 'dict' オブジェクトは呼び出し可能ではありません。
-
Pycharmでコードを実行すると、「ValueError: need more than 1 value to unpack」というエラーメッセージが表示されますが、これを処理できます。