先週紹介した学習コンテンツ「Kaggle Courses : Pandas」で「欠損値 (Missing data) : NaN」の取り扱いを学んだけど,その後「Pandas ライブラリ活用入門」を読んでいたら「置換 :
fillna() 関数」に多くのパラメータがあり,他にも「補間 : interoperete() 関数」という選択肢も載っていた.本書やドキュメントを読みながら,気になった機能を試していく💪

Pythonデータ分析/機械学習のための基本コーディング! pandasライブラリ活用入門 (impress top gear)
- 作者:Daniel Y. Chen
- 発売日: 2019/02/22
- メディア: 単行本(ソフトカバー)
データセット 📈
今回の検証では,本書と同じく GitHub リポジトリ chendaniely/pandas_for_everyone に含まれているデータセット country_timeseries.csv を使う.「エボラ出血熱の発生数と死者数を国別にまとめたデータセット」となり,以下の通り,NaN を多く含んでいる(赤く強調しておいた🖍).なお,今回は結果を単純化するため以下の「5カラム」に限定して載せる.
Date: 日付Cases_Guinea: ギニア(発生数)Cases_Liberia: リベリア共和国(発生数)Deaths_Guinea: ギニア(死者数)Deaths_Liberia: リベリア共和国(死者数)
ebola = pd.read_csv('./country_timeseries.csv') ebola.loc[:, ['Date','Cases_Guinea', 'Cases_Liberia', 'Deaths_Guinea', 'Deaths_Liberia']].head(10)

1. 置換 : fillna() 関数 📈
1-1. fillna(0)
まず,fillna() 関数を使うと簡単に NaN を置換できる.例えば,以下のように fillna(0) と実装すると全て 0.0 になる(NaN 以外は黄色く強調しておいた🖍).
ebola.fillna(0).loc[:, ['Date','Cases_Guinea', 'Cases_Liberia', 'Deaths_Guinea', 'Deaths_Liberia']].head(10)

1-2. fillna(ebola.mean()) / fillna(ebola.median())
とは言え,実践的に使う場合は 0.0 よりも具体的な値で置換することが多いと思う.例えば「平均値 : mean() 関数」や「中央値 : median() 関数」と組み合わせると,DataFrame から算出した統計値で置換することもできる.
ebola.fillna(ebola.mean()).loc[:, ['Date','Cases_Guinea', 'Cases_Liberia', 'Deaths_Guinea', 'Deaths_Liberia']].head(10) ebola.fillna(ebola.median()).loc[:, ['Date','Cases_Guinea', 'Cases_Liberia', 'Deaths_Guinea', 'Deaths_Liberia']].head(10)

1-3. fillna(method='pad') / fillna(method='backfill')
また fillna() 関数に method パラメータを指定すると「前の値で置換 : method='pad' もしくは method='ffill'」したり「後の値で置換 : method='backfill' もしくは method='bfill'」できる.「前の値で置換」をする場合,最初から NaN になっている部分は置換の対象外となり,実際に以下の例でも NaN が残っている.
ebola.fillna(method='pad').loc[:, ['Date','Cases_Guinea', 'Cases_Liberia', 'Deaths_Guinea', 'Deaths_Liberia']].head(10) ebola.fillna(method='backfill').loc[:, ['Date','Cases_Guinea', 'Cases_Liberia', 'Deaths_Guinea', 'Deaths_Liberia']].head(10)

2. 補間 : interoperete() 関数 📈
Pandas では,特定の値で「置換」するだけではなく,DataFrame から近似した値で「補間」する方法もあり interoperete() 関数を使う.
2-1. interpolate()
まず,デフォルト設定のまま interoperete() 関数を使うと以下のようになる.カラムの値ごとに「線形的に」補間する.NaN 前後の値で補間をするため,最初から NaN になっている部分は補間の対象外となり,実際に以下の例でも NaN が残っている.
ebola.interpolate().loc[:, ['Date','Cases_Guinea', 'Cases_Liberia', 'Deaths_Guinea', 'Deaths_Liberia']].head(10)

2-2. interpolate(limit_direction='both')
次に interpolate() 関数で limit_direction パラメータを指定すると,補間する方向として forward と backward と both を指定できる.例えば limit_direction='both' のように指定すると,どちらの方向もサポートすることになり,全ての NaN を補間できるようになる.
ebola.interpolate(limit_direction='both').loc[:, ['Date','Cases_Guinea', 'Cases_Liberia', 'Deaths_Guinea', 'Deaths_Liberia']].head(10)

2-3. interpolate(limit_direction='both')
最後は method パラメータで,デフォルトでは「線形(カラム値を等間隔に補間): linear」となる.選択肢は他にもあり,例えば「インデックス(インデックス値をベースに補間): index」など.もし index を指定する場合はインデックス値が数値型である必要がある.
ebola.interpolate(method='index').loc[:, ['Date','Cases_Guinea', 'Cases_Liberia', 'Deaths_Guinea', 'Deaths_Liberia']].head(10)

まとめ 📈
引き続き Pandas を学んでいる.今回は「Pandas ライブラリ活用入門」を読みながら fillna() 関数と interoperete() 関数の気になった機能を試した💪パラメータは他にも多くあるため,ドキュメントも読みながらより理解を深めていく💡

Pythonデータ分析/機械学習のための基本コーディング! pandasライブラリ活用入門 (impress top gear)
- 作者:Daniel Y. Chen
- 発売日: 2019/02/22
- メディア: 単行本(ソフトカバー)