Open In Colab

欠損値の処理#

本節ではpandasを利用して欠損値を処理する方法を学びます。

サンプルデータとして、厚生労働省の 新型コロナウイルス感染症 オープンデータ データを利用します。

import numpy as np
import pandas as pd

df = pd.read_csv("https://www.mhlw.go.jp/content/pcr_tested_daily.csv", parse_dates=["日付"])
df.head()
日付 PCR 検査実施人数(単日)
0 2020-02-05 4.0
1 2020-02-06 19.0
2 2020-02-07 9.0
3 2020-02-08 4.0
4 2020-02-09 10.0
df.loc[40:60]
日付 PCR 検査実施人数(単日)
40 2020-03-16 2083.0
41 2020-03-17 203.0
42 2020-03-18 NaN
43 2020-03-19 3490.0
44 2020-03-20 119.0
45 2020-03-21 132.0
46 2020-03-22 56.0
47 2020-03-23 3862.0
48 2020-03-24 NaN
49 2020-03-25 674.0
50 2020-03-26 1805.0
51 2020-03-27 1442.0
52 2020-03-28 296.0
53 2020-03-29 206.0
54 2020-03-30 3481.0
55 2020-03-31 1914.0
56 2020-04-01 NaN
57 2020-04-02 4685.0
58 2020-04-03 3305.0
59 2020-04-04 271.0
60 2020-04-05 218.0

NaN#

DataFrameにNaNという値があります。NaN( numpy.nan ) とは、「Not a Number」の略で、IEEE 754で定められている浮動小数点数です。NaNはおもに欠損値として扱われます。

Python組み込みの None を数値として処理しようとすると TypeError 例外が発生します。

>>> 1 + None

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-13-4e48835ebc87> in <module>
----> 1 1 + None

TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'

前述のとおり、NaNは浮動小数点数なので算術演算ができます。

1 + np.nan
nan

== による比較演算は False になります。

np.nan == np.nan
False

NaNであることを確認するには is 演算子や isnan 関数などを利用します。

np.nan is np.nan
True
np.isnan(np.nan)
True

pandasによる欠損値の処理#

Series および DataFrame から isnull メソッドでNaNであるかを確認できます。

df.loc[40:60, "PCR 検査実施人数(単日)"].isnull()
40    False
41    False
42     True
43    False
44    False
45    False
46    False
47    False
48     True
49    False
50    False
51    False
52    False
53    False
54    False
55    False
56     True
57    False
58    False
59    False
60    False
Name: PCR 検査実施人数(単日), dtype: bool

同様にNaNでないかも確認できます。

df.loc[40:60, "PCR 検査実施人数(単日)"].notnull()
40     True
41     True
42    False
43     True
44     True
45     True
46     True
47     True
48    False
49     True
50     True
51     True
52     True
53     True
54     True
55     True
56    False
57     True
58     True
59     True
60     True
Name: PCR 検査実施人数(単日), dtype: bool

欠損値を除外するには dropna メソッドを実行します。

df.loc[40:60, "PCR 検査実施人数(単日)"].dropna()
40    2083.0
41     203.0
43    3490.0
44     119.0
45     132.0
46      56.0
47    3862.0
49     674.0
50    1805.0
51    1442.0
52     296.0
53     206.0
54    3481.0
55    1914.0
57    4685.0
58    3305.0
59     271.0
60     218.0
Name: PCR 検査実施人数(単日), dtype: float64

欠損値に何らかの値で埋めるには fillna メソッドの引数に値を渡します。

df.loc[40:60, "PCR 検査実施人数(単日)"].fillna(0)
40    2083.0
41     203.0
42       0.0
43    3490.0
44     119.0
45     132.0
46      56.0
47    3862.0
48       0.0
49     674.0
50    1805.0
51    1442.0
52     296.0
53     206.0
54    3481.0
55    1914.0
56       0.0
57    4685.0
58    3305.0
59     271.0
60     218.0
Name: PCR 検査実施人数(単日), dtype: float64

練習問題1#

df オブジェクトから「PCR 検査実施人数(単日)」列がNaNである行数を算出してください。

# 解答セル

練習問題2#

df オブジェクトから「PCR 検査実施人数(単日)」列がNaNでない行を抽出してください。

# 解答セル

練習問題3#

df オブジェクトから「PCR 検査実施人数(単日)」列がNaNの値を、その列の前の値で埋めてください。

https://pandas.pydata.org/docs/user_guide/missing_data.html#filling-missing-values-fillna

# 解答セル