こんにちは。前回は、Pandas DataFrameに潜む「欠損値」を見つけ出し、その数を確認する方法(.isnull()
, .isna()
, .sum()
, info()
)について学びました。データの中に「情報の抜け」がどれくらいあるのかを把握することは、データクリーニングの重要な第一歩でしたね。
さて、欠損値の存在を確認できたところで、次はその欠損値にどのように対処するかという、具体的なステップに進んでいきましょう。欠損値をそのままにしておくと、計算エラーや分析結果の歪み、機械学習モデルの性能低下など、様々な問題を引き起こす可能性があるため、適切な処理が必要です。
今回の記事では、Pandasを使った欠損値への主な対処法である、以下の2つのメソッドを徹底的に解説します。
.dropna()
: 欠損値を含む行や列を削除するためのメソッド。.fillna()
: 欠損値を特定の値で埋める(補完する)ためのメソッド。
それぞれのメソッドの基本的な使い方から、様々なオプション(引数)を指定した応用的な使い方まで、具体的なコード例と実行結果を見ながら丁寧に解説していきます。さらに、「削除」と「補完」のどちらを選ぶべきか、その判断基準となる考え方についても触れていきます。
この記事を読み終える頃には、あなたは状況に応じて適切な欠損値処理を選択し、Pandasを使って実行できるようになっているはずです。データのお掃除、第2弾、始めていきましょう!
なぜ欠損値に対処が必要なのか?(簡単なおさらい)
本題に入る前に、なぜ欠損値に対処する必要があるのかを簡単におさらいしておきましょう。
- 計算ができない・結果がおかしくなる: 平均値や合計などの計算でエラーが出たり、結果が
NaN
になったりします。 - 分析結果が歪む: データの一部が欠けていることで、全体の傾向を正しく捉えられなくなる可能性があります。
- 機械学習モデルが動かない・精度が下がる: 多くのモデルは欠損値があると学習できないか、性能が著しく低下します。
このような問題を避けるために、欠損値を見つけたら、そのままにせず、削除するか、何らかの値で埋める(補完する)必要があるのです。
サンプルデータの準備(欠損値を含む)
今回も、前回使用した欠損値を含むサンプルDataFramedf_nan
を使います。このDataFrameに対して、.dropna()
と.fillna()
を適用していきます。
import pandas as pd import numpy as np # NaNを使うためにNumPyをインポート # 欠損値を含むサンプルデータ data_with_nan = { '名前': ['佐藤', '鈴木', '高橋', '田中', '伊藤', None, '山本'], '年齢': [35, 28, np.nan, 31, 25, 38, 29], '部署': ['営業部', '開発部', '営業部', '人事部', None, '営業部', '開発部'], '評価スコア': [4.5, 4.8, 4.2, 4.0, 4.9, np.nan, 4.6] } df_nan = pd.DataFrame(data_with_nan) # 処理前のDataFrameを表示(再掲) print("--- 処理前のDataFrame ---") print(df_nan)
処理前のDataFrame:
--- 処理前のDataFrame ---
名前 年齢 部署 評価スコア
0 佐藤 35.0 営業部 4.5
1 鈴木 28.0 開発部 4.8
2 高橋 NaN 営業部 4.2
3 田中 31.0 人事部 4.0
4 伊藤 25.0 None 4.9
5 None 38.0 営業部 NaN
6 山本 29.0 開発部 4.6
このDataFrameには、「名前」「年齢」「部署」「評価スコア」の各列に1つずつ、合計4つの欠損値が含まれています。
対処法①:欠損値を含む行・列を削除する .dropna()
欠損値への対処法として最もシンプルなのが、欠損値が含まれている行、あるいは列を削除してしまう方法です。これには.dropna()
メソッドを使います。
ただし、削除は情報を失う行為でもあります。安易に削除すると、分析に必要なデータまで消してしまう可能性があるので、注意が必要です。どのような場合に削除が適しているか、どのようなオプションがあるかを理解しておきましょう。
基本的な使い方:欠損値を含む「行」を削除 (デフォルト)
引数を何も指定せずに.dropna()
を実行すると、デフォルトでは一つでも欠損値(NaNやNone)を含む行が全て削除されます。
# 欠損値を含む行を削除(デフォルト) df_dropped_rows = df_nan.dropna() print("--- 欠損値を含む行を削除後 ---") print(df_dropped_rows)
実行結果:
--- 欠損値を含む行を削除後 ---
名前 年齢 部署 評価スコア
0 佐藤 35.0 営業部 4.5
1 鈴木 28.0 開発部 4.8
3 田中 31.0 人事部 4.0
6 山本 29.0 開発部 4.6
元のDataFrame(7行)と比較すると、インデックスが2
(年齢がNaN)、4
(部署がNone)、5
(名前がNone、評価スコアがNaN)の行が削除され、欠損値が全く含まれない行だけが残りました。
欠損値を含む「列」を削除:axis引数
行ではなく、欠損値を含む列を削除したい場合は、axis
引数に'columns'
(または1
)を指定します。
# 欠損値を含む列を削除 df_dropped_cols = df_nan.dropna(axis='columns') # axis=1 でも同じ print("--- 欠損値を含む列を削除後 ---") print(df_dropped_cols)
実行結果:
--- 欠損値を含む列を削除後 ---
Empty DataFrame
Columns: []
Index: [0, 1, 2, 3, 4, 5, 6]
今回のサンプルデータでは、全ての列(’名前’, ‘年齢’, ‘部署’, ‘評価スコア’)に少なくとも1つの欠損値が含まれていたため、全ての列が削除され、空のDataFrameになってしまいました。これは極端な例ですが、特定の列に欠損が集中している場合には有効なことがあります。
削除の条件を指定する:how引数
デフォルトでは、一つでも欠損値があれば削除されますが(how='any'
がデフォルト)、全ての値が欠損値である行(または列)だけを削除したい場合は、how='all'
と指定します。
# 全ての値が欠損値である行を削除(今回は該当なし) df_dropped_how_all = df_nan.dropna(how='all') print("--- how='all' で行を削除後 (変化なし) ---") print(df_dropped_how_all)
実行結果 (変化なし):
--- how='all' で行を削除後 (変化なし) ---
名前 年齢 部署 評価スコア
0 佐藤 35.0 営業部 4.5
1 鈴木 28.0 開発部 4.8
2 高橋 NaN 営業部 4.2
3 田中 31.0 人事部 4.0
4 伊藤 25.0 None 4.9
5 None 38.0 営業部 NaN
6 山本 29.0 開発部 4.6
今回のデータには、全ての値が欠損値である行は存在しないため、how='all'
を指定しても何も削除されませんでした。全ての列が欠損値というケースは稀ですが、特定の状況下で役立つことがあります。
削除の閾値を指定する:thresh引数
「欠損値がいくつ以上あったら削除する」という指定ではなく、「欠損値でない値がいくつ未満だったら削除する」という形で閾値(いきち)を指定することもできます。これにはthresh
引数を使います。thresh
は threshold(閾値)の略です。
例えば、「欠損値でない値が3つ以上存在する行だけを残す」(言い換えると、非欠損値が3つ未満の行を削除する)という場合、thresh=3
と指定します。
# 非欠損値が3つ以上ある行を残す(thresh=3) df_dropped_thresh = df_nan.dropna(thresh=3) print("--- thresh=3 で行を削除後 ---") print(df_dropped_thresh)
実行結果:
--- thresh=3 で行を削除後 ---
名前 年齢 部署 評価スコア
0 佐藤 35.0 営業部 4.5
1 鈴木 28.0 開発部 4.8
2 高橋 NaN 営業部 4.2 # 非欠損値3つ (名前, 部署, スコア)
3 田中 31.0 人事部 4.0
4 伊藤 25.0 None 4.9 # 非欠損値3つ (名前, 年齢, スコア)
6 山本 29.0 開発部 4.6
元のDataFrameのインデックス5
の行(名前と評価スコアが欠損)は、非欠損値が’年齢’と’部署’の2つしかないので、thresh=3
の条件を満たせず削除されました。一方、インデックス2
(年齢が欠損)と4
(部署が欠損)の行は、非欠損値が3つあるため残っています。
thresh
は、ある程度の欠損は許容しつつ、欠損が多すぎる行(または列、axis
と組み合わせる)を削除したい場合に便利です。
特定の列の欠損値を基準に削除:subset引数
「DataFrame全体ではなく、特定の列に欠損値がある場合のみ、その行を削除したい」というケースもあります。例えば、「’評価スコア’が欠損しているデータは分析に使えないので削除したいが、他の列の欠損は気にしない」といった場合です。
これにはsubset
引数を使います。subset
には、欠損値をチェックしたい列名のリストを指定します。
# '評価スコア'列に欠損値がある行を削除 df_dropped_subset = df_nan.dropna(subset=['評価スコア']) print("--- subset=['評価スコア'] で行を削除後 ---") print(df_dropped_subset)
実行結果:
--- subset=['評価スコア'] で行を削除後 ---
名前 年齢 部署 評価スコア
0 佐藤 35.0 営業部 4.5
1 鈴木 28.0 開発部 4.8
2 高橋 NaN 営業部 4.2
3 田中 31.0 人事部 4.0
4 伊藤 25.0 None 4.9
6 山本 29.0 開発部 4.6
‘評価スコア’列がNaN
だったインデックス5
の行だけが削除されました。他の列(’名前’, ‘年齢’, ‘部署’)に欠損値があっても、’評価スコア’列に値があればその行は残ります。
.dropna()の注意点:元のDataFrameは変更されない
.dropna()
メソッド(や、後述する.fillna()
など、Pandasの多くの操作メソッド)は、デフォルトでは元のDataFrame(ここではdf_nan
)自体を変更しません。代わりに、処理結果を反映した新しいDataFrameを返します。
もし、元のDataFrameを直接変更したい場合は、inplace=True
という引数を指定します。
# inplace=True を使って元のDataFrameを直接変更する例(実行注意) # df_copy = df_nan.copy() # 元のデータを残したい場合はコピーを作成 # print("--- inplace=True 実行前 ---") # print(df_copy) # df_copy.dropna(inplace=True) # print("--- inplace=True 実行後 ---") # print(df_copy)
inplace=True
を使うと、メソッドはNone
(何も返さない)を返し、呼び出し元のDataFrameが直接書き換えられます。便利ですが、元のデータが失われるため、使う際には注意が必要です。通常は、結果を新しい変数に代入する方法(df_dropped = df_nan.dropna()
)の方が安全でおすすめです。
削除(.dropna())のメリット・デメリット
* メリット:
* 操作がシンプルで簡単。
* 欠損値を含む不確かなデータを除外できるため、分析結果の信頼性が(場合によっては)向上する。
* デメリット:
* データ(情報)を損失する。特に、削除する行や列が多い場合、分析に使えるデータ量が大幅に減ってしまう可能性がある。
* データがランダムに欠損しているのではなく、特定の傾向を持って欠損している場合(例:特定のグループのデータだけ欠損が多い)、削除によって分析結果に偏り(バイアス)が生じる可能性がある。
対処法②:欠損値を特定の値で埋める .fillna()
欠損値を含む行や列を削除する代わりに、欠損箇所を何らかの値で埋める(補完する)という対処法もあります。これには.fillna()
メソッドを使います。
補完は、削除と違ってデータ量を維持できるという大きなメリットがあります。しかし、どのような値で埋めるかによって、分析結果が変わってくる可能性があるため、補完方法の選択は慎重に行う必要があります。
固定の値で補完:value引数
最も簡単なのは、全ての欠損値を特定の固定値で埋める方法です。value
引数に補完したい値を指定します。
例1:全ての欠損値を0
で補完する
(注意:数値列以外の欠損値も0で埋められてしまうため、通常は列ごとに使い分けることが多いです)
# 全ての欠損値を0で補完 df_filled_zero = df_nan.fillna(0) print("--- 全ての欠損値を0で補完後 ---") print(df_filled_zero)
実行結果:
--- 全ての欠損値を0で補完後 ---
名前 年齢 部署 評価スコア
0 佐藤 35.0 営業部 4.5
1 鈴木 28.0 開発部 4.8
2 高橋 0.0 営業部 4.2
3 田中 31.0 人事部 4.0
4 伊藤 25.0 0 4.9
5 0 38.0 営業部 0.0
6 山本 29.0 開発部 4.6
NaN
やNone
だった箇所が0
(または0.0
)で埋められました。しかし、「名前」が0
、「部署」が0
というのは不自然ですね。
例2:文字列の欠損値を「不明」で補完する
通常は、列のデータ型に合わせて適切な値で補完します。例えば、「名前」や「部署」の欠損を「不明」という文字列で埋めてみましょう。(※ただし、この方法では数値列の欠損値はそのまま残ります)
# 文字列の欠損値(と想定される箇所)を'不明'で補完 # (実際には列を指定して行うことが多い) df_filled_unknown = df_nan.fillna('不明') # あくまで例示のため print("--- 文字列欠損を'不明'で補完後 ---") print(df_filled_unknown)
実行結果:
--- 文字列欠損を'不明'で補完後 ---
名前 年齢 部署 評価スコア
0 佐藤 35.0 営業部 4.5
1 鈴木 28.0 開発部 4.8
2 高橋 不明 営業部 4.2
3 田中 31.0 人事部 4.0
4 伊藤 25.0 不明 4.9
5 不明 38.0 営業部 不明
6 山本 29.0 開発部 4.6
意図しない列(評価スコア)まで「不明」で埋まってしまいました。やはり、列ごとに補完方法を変える方が良さそうです。
統計量で補完:平均値、中央値、最頻値
数値データの欠損値を補完する際によく使われるのが、その列の統計量(代表値)で埋める方法です。
平均値 (Mean) で補完:
その列の欠損値以外の値の平均値で埋めます。全体の傾向を大きく変えにくい方法の一つです。
# '年齢'列の欠損値を、'年齢'列の平均値で補完 mean_age = df_nan['年齢'].mean() # まず平均値を計算 df_filled_mean_age = df_nan.copy() # 元データを変更しないようにコピー df_filled_mean_age['年齢'] = df_nan['年齢'].fillna(mean_age) print(f"'年齢'の平均値: {mean_age:.2f}") # 平均値を表示 print("--- '年齢'を平均値で補完後 ---") print(df_filled_mean_age)
実行結果:
'年齢'の平均値: 31.00
--- '年齢'を平均値で補完後 ---
名前 年齢 部署 評価スコア
0 佐藤 35.0 営業部 4.5
1 鈴木 28.0 開発部 4.8
2 高橋 31.0 営業部 4.2
3 田中 31.0 人事部 4.0
4 伊藤 25.0 None 4.9
5 None 38.0 営業部 NaN
6 山本 29.0 開発部 4.6
インデックス2
の’年齢’のNaN
が、他の年齢の平均値である31.0
で補完されました。
中央値 (Median) で補完:
その列の欠損値以外の値の中央値(データを小さい順に並べたときの真ん中の値)で埋めます。平均値は外れ値(極端に大きい/小さい値)の影響を受けやすいですが、中央値はその影響を受けにくいため、データに外れ値が含まれる可能性がある場合に適しています。
# '評価スコア'列の欠損値を、'評価スコア'列の中央値で補完 median_score = df_nan['評価スコア'].median() # まず中央値を計算 df_filled_median_score = df_nan.copy() df_filled_median_score['評価スコア'] = df_nan['評価スコア'].fillna(median_score) print(f"'評価スコア'の中央値: {median_score}") # 中央値を表示 print("--- '評価スコア'を中央値で補完後 ---") print(df_filled_median_score)
実行結果:
'評価スコア'の中央値: 4.55
--- '評価スコア'を中央値で補完後 ---
名前 年齢 部署 評価スコア
0 佐藤 35.0 営業部 4.50
1 鈴木 28.0 開発部 4.80
2 高橋 NaN 営業部 4.20
3 田中 31.0 人事部 4.00
4 伊藤 25.0 None 4.90
5 None 38.0 営業部 4.55
6 山本 29.0 開発部 4.60
インデックス5
の’評価スコア’のNaN
が、他の中央値である4.55
で補完されました。
最頻値 (Mode) で補完:
その列で最も頻繁に出現する値(最頻値)で埋めます。これは、数値データよりもカテゴリデータ(文字列など)の欠損値補完によく使われます。
# '部署'列の欠損値を、'部署'列の最頻値で補完 mode_dept = df_nan['部署'].mode()[0] # 最頻値を計算 (.mode()はSeriesを返すので[0]で値を取得) df_filled_mode_dept = df_nan.copy() df_filled_mode_dept['部署'] = df_nan['部署'].fillna(mode_dept) print(f"'部署'の最頻値: {mode_dept}") # 最頻値を表示 print("--- '部署'を最頻値で補完後 ---") print(df_filled_mode_dept)
実行結果:
'部署'の最頻値: 営業部
--- '部署'を最頻値で補完後 ---
名前 年齢 部署 評価スコア
0 佐藤 35.0 営業部 4.5
1 鈴木 28.0 開発部 4.8
2 高橋 NaN 営業部 4.2
3 田中 31.0 人事部 4.0
4 伊藤 25.0 営業部 4.9
5 None 38.0 営業部 NaN
6 山本 29.0 開発部 4.6
インデックス4
の’部署’のNone
が、最頻値である営業部
で補完されました。
前後の値で補完:method引数
時系列データなど、データの順序に意味がある場合、直前の値や直後の値で欠損値を埋めたいことがあります。これにはmethod
引数を使います。
method='ffill'
(Forward fill): 直前の行の値で欠損値を埋めます。method='bfill'
(Backward fill): 直後の行の値で欠損値を埋めます。
# method='ffill'で補完(前の値で埋める) df_filled_ffill = df_nan.fillna(method='ffill') print("--- method='ffill' で補完後 ---") print(df_filled_ffill)
実行結果:
--- method='ffill' で補完後 ---
名前 年齢 部署 評価スコア
0 佐藤 35.0 営業部 4.5
1 鈴木 28.0 開発部 4.8
2 高橋 28.0 営業部 4.2
3 田中 31.0 人事部 4.0
4 伊藤 25.0 人事部 4.9
5 伊藤 38.0 営業部 4.9
6 山本 29.0 開発部 4.6
各NaN
/None
が、その直前の行の値で埋められています(例:インデックス2の年齢は、インデックス1の年齢28.0で補完)。ただし、インデックス0に欠損値がある場合は、前に値がないため補完されずに残ります。
# method='bfill'で補完(後ろの値で埋める) df_filled_bfill = df_nan.fillna(method='bfill') print("--- method='bfill' で補完後 ---") print(df_filled_bfill)
実行結果:
--- method='bfill' で補完後 ---
名前 年齢 部署 評価スコア
0 佐藤 35.0 営業部 4.5
1 鈴木 28.0 開発部 4.8
2 高橋 31.0 営業部 4.2
3 田中 31.0 人事部 4.0
4 伊藤 25.0 営業部 4.9
5 山本 38.0 営業部 4.6
6 山本 29.0 開発部 4.6
今度は、各欠損値がその直後の行の値で埋められています。最後の行に欠損値がある場合は、後ろに値がないため補完されません。
列ごとに異なる値で補完
これまではDataFrame全体、あるいは特定の列に対して単一の方法で補完してきましたが、実際には列ごとに異なる方法で補完したい場合が多いです。例えば、「年齢は平均値で、部署は最頻値で、評価スコアは0で埋めたい」といった場合です。
このような場合は、fillna()
のvalue
引数に辞書を渡します。辞書のキーに列名、値にその列で補完したい値を指定します。
# 列ごとに異なる値で補完するための辞書を作成 fill_values = { '名前': '不明', '年齢': df_nan['年齢'].mean(), # 平均値 '部署': df_nan['部署'].mode()[0], # 最頻値 '評価スコア': 0 # 固定値 } # 辞書を使って補完 df_filled_dict = df_nan.fillna(value=fill_values) print("--- 列ごとに異なる値で補完後 ---") print(df_filled_dict)
実行結果:
--- 列ごとに異なる値で補完後 ---
名前 年齢 部署 評価スコア
0 佐藤 35.0 営業部 4.5
1 鈴木 28.0 開発部 4.8
2 高橋 31.0 営業部 4.2
3 田中 31.0 人事部 4.0
4 伊藤 25.0 営業部 4.9
5 不明 38.0 営業部 0.0
6 山本 29.0 開発部 4.6
各列の欠損値が、辞書で指定されたそれぞれの値(’名前’は’不明’、’年齢’は平均値31.0、’部署’は最頻値’営業部’、’評価スコア’は0)で正しく補完されました。この方法が、実務では最もよく使われる補完方法の一つです。
補完(.fillna())のメリット・デメリット
* メリット:
* データの損失を防ぎ、データ量を維持できる。
* 適切な方法で補完すれば、データの全体的な傾向を(削除に比べて)維持しやすい。
* デメリット:
* 不適切な値で補完すると、かえってデータの分布を歪めたり、誤った分析結果を導いたりする可能性がある。例えば、全て0で埋める、平均値で埋める、といった単純な方法が常に最適とは限らない。
* どの値で補完するのが最も適切か、判断が難しい場合がある。ドメイン知識(そのデータが扱っている分野の知識)や、データの特性を考慮する必要がある。
削除 vs 補完:どちらを選ぶべきか?
.dropna()
による削除と、.fillna()
による補完、どちらを選ぶべきかは、状況によって異なり、一概に「こちらが良い」とは言えません。判断するための主な考慮事項をいくつか挙げます。
- 欠損値の割合:
- 欠損値が非常に少ない場合(例:全体の1%未満など): 削除してもデータ全体への影響は小さいと考えられるため、削除(
dropna()
)が手軽で妥当な選択肢になることがあります。 - 欠損値が多い場合: 削除すると大量の情報を失ってしまうため、補完(
fillna()
)を検討する方が良いでしょう。ただし、欠損があまりにも多い列(例:半分以上が欠損など)は、その列自体の削除(df.drop()
など)も選択肢に入ります。
- 欠損値が非常に少ない場合(例:全体の1%未満など): 削除してもデータ全体への影響は小さいと考えられるため、削除(
- 欠損値の発生パターン:
- 完全にランダムに発生している(MCAR: Missing Completely At Random)場合: 削除しても結果への偏りは比較的小さいと考えられます。
- 他の変数の値に依存して欠損している(MAR: Missing At Random)場合や、欠損していること自体に意味がある(MNAR: Missing Not At Random)場合: 単純な削除は結果を歪める可能性があります。補完や、より高度な欠損値処理手法(多重代入法など)を検討する必要があります。
- データの性質:
- 時系列データ: データの順序が重要なので、単純な削除や平均値での補完は適さないことが多いです。前後の値での補完(
ffill
,bfill
)や、時系列モデルに基づいた補完が検討されます。 - カテゴリデータ: 平均値や中央値は使えません。「不明」などの新しいカテゴリで埋めるか、最頻値で埋めるかなどを検討します。
- 時系列データ: データの順序が重要なので、単純な削除や平均値での補完は適さないことが多いです。前後の値での補完(
- 分析の目的:
- 非常に高い精度が求められる分析やモデル構築では、不確実な補完を行うよりも、信頼できるデータだけを使うために削除を選択することがあります。
- 探索的なデータ分析で、まずは全体の傾向を見たい場合は、補完によってデータ量を維持する方が有利なことがあります。
- 補完方法の妥当性:
- 平均値や中央値で補完するのが本当に妥当か?データの分布を大きく変えないか?
- 固定値(例:0)で補完する場合、その値がデータとして意味を持つか?
- より高度な補完方法(回帰補完、k-NN補完など)を使うべきか?(これらはより専門的な知識が必要です)
結局のところ、「これが絶対の正解」という方法は存在しません。データの背景を理解し、欠損の状況を確認し、いくつかの方法を試してみて、分析の目的に最も合った方法を選択していく、という試行錯誤のプロセスが重要になります。
まとめ
今回は、Pandasを使った欠損値への対処法として、削除(.dropna()
)と補完(.fillna()
)の基本的な使い方と注意点を学びました。
- 欠損値の削除 (
.dropna()
):- 欠損値を含む行(デフォルト)または列(
axis='columns'
)を削除する。 how='all'
で全て欠損の場合のみ削除、thresh=N
で非欠損値がN個未満の場合に削除、subset=[列名]
で特定の列の欠損を基準に削除できる。- メリット: シンプル。デメリット: データ損失、結果の偏りの可能性。
- 欠損値を含む行(デフォルト)または列(
- 欠損値の補完 (
.fillna()
):- 欠損値を特定の値で埋める。
- 固定値(
value=定数
)、統計量(平均値.mean()
、中央値.median()
、最頻値.mode()[0]
)、前後の値(method='ffill'/'bfill'
)などで補完できる。 - 列ごとに異なる値で補完するには辞書(
value={'列名': 値, ...}
)を使う。 - メリット: データ量を維持できる。デメリット: 不適切な補完は結果を歪める可能性。補完方法の選択が重要。
- 削除 vs 補完:
- どちらが良いかは一概に言えず、欠損の割合、パターン、データの性質、分析目的などを考慮して判断する。
- 試行錯誤が必要な場合が多い。
- 共通の注意点:
.dropna()
も.fillna()
も、デフォルトでは元のDataFrameを変更せず、新しいDataFrameを返す。元のDataFrameを直接変更するにはinplace=True
を指定する(非推奨)。
欠損値処理は、データ分析や機械学習の精度と信頼性を左右する非常に重要なステップです。今回学んだ基本をしっかり押さえ、実際のデータに向き合う準備をしましょう。
次回予告
データクリーニングの旅はまだ続きます。欠損値と並んでよく遭遇するのが、「重複したデータ」です。同じ情報が複数行にわたって記録されていると、集計結果が不正確になったり、分析にノイズが入ったりする原因となります。
次回は、Pandasを使って重複した行を見つけ出し、削除する方法について解説します。.duplicated()
メソッドと.drop_duplicates()
メソッドの使い方を学び、よりクリーンなデータを目指しましょう!お楽しみに!