Pythonでpandas入門5(欠損値(NaN)の扱い)

Pythonのデータ分析で用いられるpandasの入門編です。欠損値の確認や置換方法について解説します。

目次

  1. 欠損値NaNがデータに含まれているか確認する
  2. 要素が欠損値(NaN)か判定する
  3. 行や列に欠損値(NaN)が含まれるか判定する
  4. 欠損値(NaN)の数をカウントする
  5. 欠損値(NaN)が含まれる行または列を削除する
  6. 特定の列に欠損値がある行を削除する
  7. 欠損値(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

公開日

広告