欠損値の処理
Contents
欠損値の処理#
本節では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
# 解答セル