【python】dataframeの欠損値の確認方法について徹底解説

データ分析に興味を持ち始めたって方へ

今回はPythonのPandasを使って

dataframeの基本的な操作から

欠損値の確認方法までを基礎から解説します

おへんじ
具体例を使って詳しく解説するね
  • Pandas DataFrameの基本的な使い方を知りたい方
  • dataframeの作成方法や読み込み方法を知りたい方
  • dataframe内の欠損値のいろんな確認方法を学びたい方

DataFrameの基本(データ作成・読み込み・書き込み)

Pandasは、Pythonでデータを扱うための強力なライブラリです

特に、DataFrameというデータ構造が非常に便利で

Excelの表のような形式でデータを管理できます

データの作成方法

例えば、次のようにして簡単にDataFrameを作成できます。

import pandas as pd

# サンプルデータを辞書形式で作成
data = {
'名前': ['田中', '佐藤', '鈴木'],
'年齢': [23, 30, 25],
'職業': ['エンジニア', 'デザイナー', 'データサイエンティスト']
}

# dataframeの作成
df = pd.DataFrame(data)
print(df)

# 出力結果
# 	名前	年齢	 職業
# 0	田中	23	 エンジニア
# 1	佐藤	30	 デザイナー
# 2	鈴木	25	 データサイエンティスト
おへんじ
列や行を指定してデータを修正したりできるよー

データの読み込み/書き込みの方法

dataframeは以下のように他のデータ形式

に書き込んだり,読み込んだりすることができます

import pandas as pd

# DataFrameを作成
df = pd.DataFrame({
    'A': [1, 2, 3],
    'B': [4, 5, 6],
    'C': [7, 8, 9]
})

# 1. CSVファイルとして保存
# 書き込み (CSV形式)
df.to_csv('temporary_data.csv', index=False)  
# 読み込み (CSV形式)
df_csv = pd.read_csv('temporary_data.csv')

# 2. Excelファイルとして保存
# 書き込み (Excel形式)
df.to_excel('temporary_data.xlsx', index=False)  
# 読み込み (Excel形式)
df_excel = pd.read_excel('temporary_data.xlsx')

# 3. Pickle形式で保存
# 書き込み (Pickle形式)
df.to_pickle('temporary_data.pkl')  
# 読み込み (Pickle形式)
df_pickle = pd.read_pickle('temporary_data.pkl')

# 4. HDF5形式で保存
# 書き込み (HDF5形式)
df.to_hdf('temporary_data.h5', key='df', mode='w')  
# 読み込み (HDF5形式)
df_hdf = pd.read_hdf('temporary_data.h5', key='df')

# 5. JSON形式で保存
# 書き込み (JSON形式)
df.to_json('temporary_data.json')  
# 読み込み (JSON形式)
df_json = pd.read_json('temporary_data.json')
おへんじ
データを読み込むときは「ファイル格納場所+ファイル名」でファイルを指定してね

dataframeの基本情報を確認する方法

次にデータの構造や内容を

確認する方法を紹介します

行数/列数/データ型の確認

行数やデータ型の確認をしたいときは

以下のようにdf.info()を使用します

# dfの中身
# 	名前	年齢	 職業
# 0	田中	23	 エンジニア
# 1	佐藤	30	 デザイナー
# 2	鈴木	25	 データサイエンティスト

# dataframeの基本情報を表示
print(df.info())

# 出力結果
# 
# RangeIndex: 3 entries, 0 to 2
# Data columns (total 3 columns):
#  #   Column  Non-Null Count  Dtype 
#  0   名前      3 non-null      object
#  1   年齢      3 non-null      int64 
#  2   職業      3 non-null      object
# dtypes: int64(1), object(2)
# memory usage: 200.0+ bytes
# None

df.info()で、各列のデータ型

欠損値の有無が確認できます

おへんじ
「non_null」は欠損値がないことを示しているよ

データ型には主に以下のような形式があります

  • int64: 64ビット整数
  • float64: 64ビット浮動小数点数
  • object: 文字列または任意のオブジェクト
  • bool: 真偽値(True/False)
  • datetime64: 日付と時間
  • category: カテゴリデータ

データの統計量を確認

データの平均値などの統計量を確認するには

describe()関数を使います

# dfの中身
# 	名前	年齢	 職業
# 0	田中	23	 エンジニア
# 1	佐藤	30	 デザイナー
# 2	鈴木	25	 データサイエンティスト

# 数値データの統計量を表示
print(df.describe())

# 出力結果
#         年齢
# count   3.000000
# mean   26.000000
# std     3.605551
# min    23.000000
# 25%    24.000000
# 50%    25.000000
# 75%    27.500000
# max    30.000000

describe()を使うことでデータ型が数値の列

平均値、最大値、最小値などの基本統計量を把握できます

欠損値の確認方法とその具体例の紹介

データ分析を行う際

欠損値の確認は重要です

おへんじ
具体例使って欠損値の確認方法を紹介するねー
今回紹介する例はあくまで一例を示しているものなので
参考程度にしてください
おへんじ
dataframeの操作はlocやiloc,queryなどいろいろあるよー

1. 欠損値の有無を確認

isnull()関数を使って

データが欠損しているか確認できます

# サンプルデータを作成
data = {
'名前': ['田中', '佐藤', None, '高橋', '木村'],
'年齢': [23, None, 25, 28, 22],
'職業': ['エンジニア', 'デザイナー', 'データサイエンティスト', None, 'アナリスト'],
'給与': [500, 600, 700, None, 500]
}

df = pd.DataFrame(data)
print(df)
# df 
#      名前   年齢    職業                  給与
# 0    田中   23.0    エンジニア            500.0
# 1    佐藤   NaN     デザイナー            600.0
# 2    None  25.0    データサイエンティスト  700.0
# 3    高橋   28.0    None                NaN
# 4    木村   22.0    アナリスト            500.0

# 欠損値の有無を確認
print(df.isnull())
# df.isnull() 出力結果
#    名前    年齢    職業   給与
# 0  False  False  False  False
# 1  False   True  False  False
# 2   True  False  False  False
# 3  False  False   True   True
# 4  False  False  False  False

この結果では、True部分が欠損値です

2. 欠損値の数を列ごとに確認

欠損値の数を列ごとに確認するには

isnull()とsum()を組み合わせます

# df 
#      名前   年齢    職業                  給与
# 0    田中   23.0    エンジニア            500.0
# 1    佐藤   NaN     デザイナー            600.0
# 2    None  25.0    データサイエンティスト  700.0
# 3    高橋   28.0    None                NaN
# 4    木村   22.0    アナリスト            500.0

# 列ごとの欠損値の数を確認
print(df.isnull().sum())

# df.isnull().sum() 出力結果
# 名前    1
# 年齢    1
# 職業    1
# 給与    1
# dtype: int64

ここでは各列に1つずつ欠損値があることがわかります

3. 欠損値の割合を確認

欠損値の割合を確認するには

isnull()とmean()を組み合わせます

# df 
#      名前   年齢    職業                  給与
# 0    田中   23.0    エンジニア            500.0
# 1    佐藤   NaN     デザイナー            600.0
# 2    None  25.0    データサイエンティスト  700.0
# 3    高橋   28.0    None                NaN
# 4    木村   22.0    アナリスト            500.0

# 列ごとの欠損値の割合を確認
print(df.isnull().mean() * 100)

# 出力結果
# 名前    20.0
# 年齢    20.0
# 職業    20.0
# 給与    20.0
# dtype: float64

ここでは各列2割欠損値があることがわかります

4. 欠損値が含まれる行/列を抽出

欠損値がある行・列は以下のようなコードで

確認することができます

# df 
#      名前   年齢    職業                  給与
# 0    田中   23.0    エンジニア            500.0
# 1    佐藤   NaN     デザイナー            600.0
# 2    None  25.0    データサイエンティスト  700.0
# 3    高橋   28.0    None                NaN
# 4    木村   22.0    アナリスト            500.0

# 欠損値を含む行を抽出
print(df[df.isnull().any(axis=1)])
# 出力結果
#      名前   年齢    職業                  給与
# 1    佐藤   NaN     デザイナー            600.0
# 2    None  25.0    データサイエンティスト  700.0
# 3    高橋   28.0    None                NaN

# 欠損値を含む列を抽出
print(df.loc[:, df.isnull().any()])
# 出力結果
#      名前   年齢    職業                  給与
# 0    田中   23.0    エンジニア            500.0
# 1    佐藤   NaN     デザイナー            600.0
# 2    None  25.0    データサイエンティスト  700.0
# 3    高橋   28.0    None                NaN
# 4    木村   22.0    アナリスト            500.0

any関数は行・列に対して欠損値が

あるどうかをTrue/Falseで返します

おへんじ
axis=0は行方向axis=1は列方向を指定できるよ

5. 特定の列に欠損値がある行/ない行を抽出

任意の列(例: 年齢列)に

欠損値がある行だけを抽出します

# df 
#      名前   年齢    職業                  給与
# 0    田中   23.0    エンジニア            500.0
# 1    佐藤   NaN     デザイナー            600.0
# 2    None  25.0    データサイエンティスト  700.0
# 3    高橋   28.0    None                NaN
# 4    木村   22.0    アナリスト            500.0

# '年齢'列に欠損値がある行を抽出
print(df[df['年齢'].isnull()])

# 出力結果
#      名前   年齢    職業                  給与
# 1    佐藤   NaN     デザイナー            600.0

欠損値がない行を抽出する場合は

ある行を抽出するコードに”~”をつけるだけです

# '年齢'列に欠損値がない行を抽出
print(df[~df['年齢'].isnull()])

# 出力結果
#      名前   年齢    職業                  給与
# 0    田中   23.0    エンジニア            500.0
# 2    None  25.0    データサイエンティスト  700.0
# 3    高橋   28.0    None                NaN
# 4    木村   22.0    アナリスト            500.0

【豆知識】”~”をつけると指定した条件に当てはまらない行が表示されます

6. 欠損値がない行のみを抽出

欠損値がない行のみを取得するには

dropna関数を使用します

# df 
#      名前   年齢    職業                  給与
# 0    田中   23.0    エンジニア            500.0
# 1    佐藤   NaN     デザイナー            600.0
# 2    None  25.0    データサイエンティスト  700.0
# 3    高橋   28.0    None                NaN
# 4    木村   22.0    アナリスト            500.0

# 全ての列が欠損値でない行を抽出
print(df.dropna())
# 出力結果
#      名前   年齢    職業                  給与
# 0    田中   23.0    エンジニア            500.0
# 4    木村   22.0    アナリスト            500.0

7. 欠損値があるかどうかを簡易に確認

dataframeに欠損値が

含まれているかどうかだけをTrue/Falseで確認します

# dataframeに欠損値があるか確認
print(df.isnull().values.any())

# 出力結果
# True

8. 欠損値を視覚的に確認する

欠損値を視覚的に確認するためには

ヒートマップを作成します

# df 
#      名前   年齢    職業                  給与
# 0    田中   23.0    エンジニア            500.0
# 1    佐藤   NaN     デザイナー            600.0
# 2    None  25.0    データサイエンティスト  700.0
# 3    高橋   28.0    None                NaN
# 4    木村   22.0    アナリスト            500.0

import seaborn as sns
import matplotlib.pyplot as plt

# 欠損値のヒートマップを表示
sns.heatmap(df.isnull(), cbar=False, cmap='viridis')
plt.show()

このコードを実行すると、以下のような

欠損値の分布を示すヒートマップで表示されます

欠損値が薄黄色

表示されるので、一目で欠損値の分布を確認できます

dorpnaを使用した欠損値の取り扱い

具体例の方でも紹介しましたが

欠損値を取り扱う際に便利なdropna関数があります

引数を設定することでさまざまな操作が可能ですので

いくつか紹介しておきます

# 欠損値を含む列を削除(axis)
df.dropna(axis=1)

# すべての値が欠損している行を削除(how)
df.dropna(how='all')

# 非NaN値が2つ未満の行を削除(thresh)
df.dropna(thresh=2)

# 元のdataframeを直接変更(inplace)
df.dropna(inplace=True)

# 列 'A' と 'B' に NaN がある行を削除(subset)
df.dropna(subset=['A', 'B'])

dropnaの各引数について説明しておきます

axis

行 (0 または ‘index’) または列 (1 または ‘columns’) の削除を指定

how

・’any’:1つでも欠損値がある行または列を削除

・’all’:すべてが欠損値の場合のみ行または列を削除

thresh

指定した数以上の非NaN値がある行または列を保持

subset

特定の行または列に対してのみ欠損値を確認し、削除を適用

inplace

・True:元のdataframeを直接変更

・False(デフォルト):変更後の新しいdataframeを返す

ignore_index

・True:削除後にインデックスをリセットし、新しいインデックスを割り当てる

・False(デフォルト):元のインデックスを保持

このよう欠損値を確認することで

データの傾向を把握したり

データの補完方法の検討につなげたりすることができます

pythondataframeの使い方をマスターして

データ分析などができるように一緒にがんばっていきましょう!

最新情報をチェックしよう!