HOWTO · Pandas
Pandas でセルが空かどうかを確認する
このチュートリアルでは、Pandas データフレームのセルが空かどうかを確認する方法について詳しく説明します。
このページの内容
Pandasのチェックで見つかるのは、ライブラリが欠損値として認識する値です。空白に見える値がすべて欠損値として扱われるわけではありません。NaN、None、NaTは欠損値の表現例ですが、空文字列("")は、明示的に変換しない限り通常の文字列です。インポートしたデータで空白のテキストが情報の欠落を表している場合、この違いが重要になります。
Pandasで欠損値として扱われるものを理解する
isna()またはその別名isnull()を使うと、真偽値マスクを作成できます。Trueは欠損値として認識された値、Falseは値が存在することを示します。同じ操作をスカラー、Series(1列)、DataFrameに適用できます。マスクの形状とラベルは、チェック対象のオブジェクトと同じです。
以下の例では、欠損値を作るためにNoneを使用しています。提供された実行証拠には、実行可能なPythonの例4つすべての出力が含まれています。
isna()またはisnull()でセルまたは列を確認する
次の例を実行します。
このセクションのコードと表示されるラベルや出力は英語のままです。
import pandas as pd
df = pd.DataFrame({"name": ["Ari", "Bo", "Cy"], "score": [8, None, 6]}, index=[10, 11, 12])
cell_missing = pd.isna(df.loc[11, "score"])
column_mask = df["score"].isna()
print(cell_missing)
print(column_mask.tolist())
locは行ラベルと列ラベルで選択するため、df.loc[11, "score"]は行ラベル11のセルをチェックします。位置で選択するには、ilocを使います。たとえば、df.iloc[1, 1]のように指定します。DataFrameにカスタムインデックスがある場合、行ラベルと行位置は異なることがあります。isna()とisnull()は同じ機能を持つ別名です。どちらか一方を選び、一貫して使ってください。Pandasのisnull()のドキュメントにも、同じ欠損値チェックが説明されています。
列全体に対しては、df["score"].isna()が行ごとに1つの真偽値を返します。DataFrame全体に対しては、df.isna()が行ラベルと列ラベルを維持した真偽値のDataFrameを返します。これらのマスクを確認したり、df.loc[df["score"].isna()]のように一致する行を選択したりできます。
any()で欠損値があるかどうかを確認する
列のマスクにany()を呼び出すと、その列について1つの真偽値が得られます。DataFrameでは、df.isna().any()が列ごとに1つの結果を持つ真偽値のSeriesを返します。さらにそのSeriesにany()を適用すると、いずれかの列に欠損値があるかどうかを確認できます。
このセクションのコードと表示されるラベルや出力は英語のままです。
import pandas as pd
df = pd.DataFrame({"name": ["Ari", "Bo", "Cy"], "score": [8, None, 6]})
missing_by_column = df.isna().any()
missing_anywhere = missing_by_column.any()
print(missing_by_column.to_dict())
print(missing_anywhere)
Pythonのany()関数は、少なくとも1つの要素が真であれば真を返します。DataFrameのマスクに1回適用すると列ごとの結果が得られ、その結果にもう1回適用すると、DataFrame全体について1つの結果が得られます。
sum()で欠損値の数を数える
合計すると、真偽値のTrueは1、Falseは0として数えられるため、欠損値マスクを合計すれば欠損値の数がわかります。1列の件数にはSeriesのマスクを合計し、列ごとの件数にはDataFrameのマスクを合計します。さらにもう一度合計すると、すべてのセルに含まれる欠損値の総数を取得できます。
このセクションのコードと表示されるラベルや出力は英語のままです。
import pandas as pd
df = pd.DataFrame({"name": ["Ari", "Bo", "Cy"], "score": [8, None, 6]})
counts_by_column = df.isna().sum()
total_missing = counts_by_column.sum()
print(counts_by_column.to_dict())
print(total_missing)
この方法で数えられるのは、Pandasが欠損値として認識する値だけです。インポートした列の空文字列も数えたい場合は、先に正規化します(たとえば、""をNoneに置き換えるなど)。その後でマスクを作成してください。
欠損値がある行のラベルを取得する
真偽値マスクを使い、値が欠損している位置に対応するSeriesのインデックスを選択します。返されるのは行の位置ではなく、行ラベルです。
このセクションのコードと表示されるラベルや出力は英語のままです。
import pandas as pd
df = pd.DataFrame({"score": [8, None, 6, None]}, index=[10, 11, 12, 13])
missing_row_labels = df.index[df["score"].isna()].tolist()
print(missing_row_labels)
一般的なPandasデータでは、このマスクを使う方法で、Pandasが認識する欠損値を扱えます。numpy.isnanは対象がより限定的で、互換性のある数値データのNaNを検査するものです。NoneやNaTなどには対応しない場合があります。列に異なる欠損値表現が使われている可能性がある場合は、isna()を使ってください。numpy.isnanは、データ型と値がその関数に適している場合に限って使用します。