HOWTO · Pandas

Pandas DataFrame の列ですべての NaN 値をゼロに置き換える方法

Pandas ライブラリの df.fillna()、df.replace()メソッドを使用して、DataFrame の NaN 値をゼロに置き換えます

このページの内容

pandasのDataFrameで1列の欠損値を置き換えるには、対象列を選択してfillna(0)を呼び出し、返されたSeriesを同じ列に代入します。df["A"] = df["A"].fillna(0) のように記述します。変更されるのは列Aだけで、ほかの列の値はそのままです。df.fillna()はDataFrame全体の欠損値も埋められるため、1列だけを処理する場合は、先にSeriesを選択することが重要です。選択したSeries内の特定の値を対象にする方法として、df.replace()も使えます。

1列の NaN 値を fillna() で置き換える

fillna()は、pandasが欠損値として認識する値を、指定した値に置き換えます。この例では、数値列のNoneはDataFrameの作成時に欠損値として表されます。fillna(0)の結果をdf["A"]に代入すると、置換がdfに反映されます。代入せずに呼び出すだけでは、DataFrameの変数は変更されません。2列目は比較用で、そちらの欠損値は残ります。

次の例を実行します。

このセクションのコードと表示されるラベルや出力は英語のままです。

import pandas as pd

df = pd.DataFrame({
    "A": [1, 2, None, 4],
    "B": [None, 2, 3, 4],
})

df["A"] = df["A"].fillna(0)
print(df.to_string())
     A    B
0  1.0  NaN
1  2.0  2.0
2  0.0  3.0
3  4.0  4.0

出力では、列Aの欠損値が0.0に変わり、列Bの欠損値はNaNのままです。コード例に表示されるラベルは英語のままです。実際のDataFrameと対象列にも、同じ代入方法を使えます。fillna()にはゼロ以外の値も指定でき、前方補完や後方補完などの方法も利用できます。ただし、これらはデータの意味や順序に合う場合に限って選んでください。DataFrame自体にdf.fillna(0)を適用すると、Aだけでなく各列の欠損値が置き換わります。

1列の NaN 値を replace() で置き換える

特定の値や複数の値を置き換えるには、replace()も使えます。Series内の欠損値を対象にするには、df["A"].replace(float("nan"), 0)のように記述し、返されたSeriesをdf["A"]に代入します。この例ではNaN値を明示的に指定しています。replace()が常にNoneをNaNとして扱うとは限らないため、そのように仮定しないでください。fillna()と同様に、選択したSeriesにこのメソッドを使えば、処理をその列だけに限定できます。DataFrame全体にdf.replace(...)を呼び出すと、複数の列で一致する値が置き換わることがあります。

今回の用途では、fillna()のほうが意図を直接表せます。選択した列にある既知のプレースホルダー値も標準化したい場合など、値の一致に基づく置換が役立つときはreplace()を使ってください。どちらの方法でも、変更後のデータを後続のコードで使うには、返された結果を代入します。この方法でinplace=Trueを指定する必要はありません。

データに合った置換値を選ぶ

分析において欠損値が意味するものをゼロで表せる場合に限り、ゼロが適切な置換値になります。たとえば、欠損している件数が「イベントが発生しなかった」ことを意味するなら適切な場合があります。一方、欠損が「不明」を意味する測定値では、ゼロにすると結果が歪む可能性があります。列や分析の内容によっては、別の定数、分野固有の値、平均値や中央値などの統計量のほうが適切かもしれません。欠損値を埋めると、観測されなかった値と実際のゼロとの区別が失われるため、置換する前に欠損の意味を判断してください。

置換値は列のデータにも合っている必要があります。数値列には数値のゼロが適していますが、テキスト列をゼロで埋めると、pandasによるデータの表現や処理に影響することがあります。後続の計算で数値型が必要な場合は、置換後のdtypeを確認してください。ここで示した例では選択した列だけを埋めるため、置換値を検討する際に関係のないデータを変更せずに済みます。

結果を確認する

df["A"]で対象列を確認するか、DataFrameを表示して、意図した値が変わったことを確かめます。その列に残っている欠損値の数を調べるには、df["A"].isna().sum()を使います。結果が0なら、そのSeriesにpandasが欠損値として認識する値は残っていません。この確認だけでは、分析上ゼロが適切だったかどうかは分かりません。置換値がデータの意味に合っていることも確認してください。結果が0でない場合は、想定した列を選択したか、メソッドが返したSeriesをその列に代入したかを確認します。