Pythonでpandas入門5(欠損値(NaN)の扱い)
Pythonのデータ分析で用いられるpandasの入門編です。欠損値の確認や置換方法について解説します。
目次
- 欠損値NaNがデータに含まれているか確認する
- 要素が欠損値(NaN)か判定する
- 行や列に欠損値(NaN)が含まれるか判定する
- 欠損値(NaN)の数をカウントする
- 欠損値(NaN)が含まれる行または列を削除する
- 特定の列に欠損値がある行を削除する
- 欠損値(NaN)を特定の値で置き換える
欠損値NaNがデータに含まれているか確認する
info()メソッドでDataFrameの情報を表示すると、その情報の中に各行に欠損値(NaN)が含まれているかを示す情報が表示されます。
import pandas as pd
df = pd.read_csv('test.csv', encoding='shift_jis')
df['price'] = [11500,None,None,None]
print(df)
df.info()
最初にDataFrameの中身を表示して、その後にinfo()でDataFrameの情報を表示します。
Name World Japan price
0 Windows 75.56 65.88 11500.0
1 OS X 16.48 16.64 NaN
2 Chrome OS 2.09 0.51 NaN
3 Linux 1.97 1.34 NaN
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4 entries, 0 to 3
Data columns (total 4 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Name 4 non-null object
1 World 4 non-null float64
2 Japan 4 non-null float64
3 price 1 non-null float64
dtypes: float64(3), object(1)
memory usage: 256.0+ bytes
行が4つあるのに対して、「price」列のNon-Null Countが1 non-null(3つがnull)となっています。
要素が欠損値(NaN)か判定する
isnull()メソッドで、DataFrameの各要素が欠損値(NaN)かどうかを調べることができます。
import pandas as pd
df = pd.read_csv('test.csv', encoding='shift_jis')
df['price'] = [11500,None,None,None]
isn = df.isnull()
print(df)
print(isn)
最初にDataFrameの中身を表示して、その後にisnull()の結果を表示します。
Name World Japan price
0 Windows 75.56 65.88 11500.0
1 OS X 16.48 16.64 NaN
2 Chrome OS 2.09 0.51 NaN
3 Linux 1.97 1.34 NaN
Name World Japan price
0 False False False False
1 False False False True
2 False False False True
3 False False False True
NaNの要素のところがTrueになります。
行や列に欠損値(NaN)が含まれるか判定する
any()メソッドは、行または列ごとにTrueが一つでもあるとTrueを返します。つまり、isnull()メソッドと組み合わせると、行または列に欠損値(NaN)が含まれるかどうかを判定できます。
import pandas as pd
df = pd.read_csv('test.csv', encoding='shift_jis')
df['price'] = [11500,None,None,None]
isn = df.isnull()
an1 = df.isnull().any()
an2 = df.isnull().any(axis=1)
print(df)
print(isn)
print(an1)
print(an2)
最初にDataFrameの中身を表示して、次にisnull()の結果を、その次にany()の結果を、最後にany(axis=1)の結果を表示します。
any()では各列の結果が表示されます。any()の引数にaxis=1を指定すると、各行の結果が表示されます。
欠損値(NaN)の数をカウントする
isnull()の結果をsum()で集計すると、各行または各列の欠損値(NaN)の数をカウントできます。これは、Trueが1、Falseが0として扱われるためです。
import pandas as pd
df = pd.read_csv('test.csv', encoding='shift_jis')
df['price'] = [11500,None,None,None]
isn = df.isnull()
su1 = df.isnull().sum()
su2 = df.isnull().sum(axis=1)
print(df)
print(isn)
print(su1)
print(su2)
最初にDataFrameの中身を表示して、次にisnull()の結果を、その次にsum()の結果を、最後にsum(axis=1)の結果を表示します。
Name World Japan price
0 Windows 75.56 65.88 11500.0
1 OS X 16.48 16.64 NaN
2 Chrome OS 2.09 0.51 NaN
3 Linux 1.97 1.34 NaN
Name World Japan price
0 False False False False
1 False False False True
2 False False False True
3 False False False True
Name 0
World 0
Japan 0
price 3
dtype: int64
0 0
1 1
2 1
3 1
dtype: int64
sum()では各列の結果が表示されます。sum()の引数にaxis=1を指定すると、各行の結果が表示されます。
欠損値(NaN)が含まれる行または列を削除する
dropna()メソッドで、欠損値を含む行または列を削除できます。
import pandas as pd
df = pd.read_csv('test.csv', encoding='shift_jis')
df['price'] = [11500,None,None,None]
df2 = df.dropna(how='any')
df3 = df.dropna(how='any',axis=1)
print(df)
print(df2)
print(df3)
最初にDataFrameの中身を表示して、次にdropna()の結果を、最後にdropna(axis=1)の結果を表示します。
Name World Japan price
0 Windows 75.56 65.88 11500.0
1 OS X 16.48 16.64 NaN
2 Chrome OS 2.09 0.51 NaN
3 Linux 1.97 1.34 NaN
Name World Japan price
0 Windows 75.56 65.88 11500.0
Name World Japan
0 Windows 75.56 65.88
1 OS X 16.48 16.64
2 Chrome OS 2.09 0.51
3 Linux 1.97 1.34
dropna()メソッドの引数ですが、how引数にanyを指定すると欠損値が1つでも含まれた行または列を削除します。axis引数に1を指定すると、列を削除します。
特定の列に欠損値がある行を削除する
dropna()メソッドにsubset引数を指定すると、特定の列に欠損値がある行を削除できます。
import pandas as pd
df = pd.read_csv('test.csv', encoding='shift_jis')
df['price'] = [11500,None,None,None]
df2 = df.dropna(subset=['price'])
print(df)
print(df2)
最初にDataFrameの中身を表示して、「price」列に欠損値がある行を削除して表示します。
Name World Japan price
0 Windows 75.56 65.88 11500.0
1 OS X 16.48 16.64 NaN
2 Chrome OS 2.09 0.51 NaN
3 Linux 1.97 1.34 NaN
Name World Japan price
0 Windows 75.56 65.88 11500.0
欠損値(NaN)を特定の値で置き換える
fillna()メソッドで欠損値を特定の値に置き換えできます。
import pandas as pd
df = pd.read_csv('test.csv', encoding='shift_jis')
df['price'] = [11500,None,None,None]
df = df.append(pd.DataFrame([['MSX',None,None,None]], columns=df.columns), ignore_index=True)
df2 = df.fillna(0)
df3 = df.fillna({'price':0,'Japan':0})
print(df)
print(df2)
print(df3)
最初にDataFrameの中身を表示して、次にfillna()で全ての欠損値を置換した場合を、最後にfillna()で特定の列の欠損値だけを置換した場合を表示します。
Name World Japan price
0 Windows 75.56 65.88 11500.0
1 OS X 16.48 16.64 NaN
2 Chrome OS 2.09 0.51 NaN
3 Linux 1.97 1.34 NaN
4 MSX NaN NaN NaN
Name World Japan price
0 Windows 75.56 65.88 11500.0
1 OS X 16.48 16.64 0.0
2 Chrome OS 2.09 0.51 0.0
3 Linux 1.97 1.34 0.0
4 MSX 0.00 0.00 0.0
Name World Japan price
0 Windows 75.56 65.88 11500.0
1 OS X 16.48 16.64 0.0
2 Chrome OS 2.09 0.51 0.0
3 Linux 1.97 1.34 0.0
4 MSX NaN 0.00 0.0
公開日
広告
Pythonでデータ分析カテゴリの投稿
- DataFrameの欠損値を特定の値で置き換える
- Pythonでpandas入門1(データの入力とデータへのアクセス)
- Pythonでpandas入門2(データの追加と削除および並び替え)
- Pythonでpandas入門3(データの統計量の計算)
- Pythonでpandas入門4(データの連結と結合)
- Pythonでpandas入門5(欠損値(NaN)の扱い)
- Pythonでデータを学習用と検証用に分割する
- Pythonでデータ分析入門1(初めての回帰分析)
- Pythonでデータ分析入門2(初めてのロジスティック回帰(2クラス分類))
- Pythonでデータ分析入門3(初めての決定木(多クラス分類))
- Pythonで回帰モデルの評価関数
- Pythonで箱ひげ図を描く
- Python(pandas)でExcelファイルを読み込んでDataFrameにする
- pandasでカテゴリ変数を数値データに変換する
- pandasでクロス集計する
- pandasで同じデータ(要素)がいくつあるか調べる
- pandasで相関係数を計算する
- pandasとseabornでデータの可視化(散布図行列)
- pandasの学習用のデータセットを入手する
- scikit-learnのサンプルデータセットを入手する