Pandasでの欠損値の処理の仕方を集めてみた　no.13


![見出しを追加 (36).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/d7624d10-1c67-0ebf-b176-72c6c2cd3bc2.png)
こんにちは、まゆみです。

Pandas についての記事をシリーズで書いています。

今回の記事は第13回目になります。



今回の記事では、<font color="Red">データのなかに欠損値があった時の処理方法</font>を色々と書いていこうと思います。


#今回使うデータについて
![スクリーンショット 2021-03-18 112844.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/ef6940f4-2a6d-4244-6394-2c4d9bf8216b.jpeg)
引用元：[kaggle.com](https://www.kaggle.com/)

今回は[kaggle.com](https://www.kaggle.com/)さんのサイトから[カナダのバンクーバーの犯罪についてのデータ](https://www.kaggle.com/wosaku/crime-in-vancouver?select=googletrend.csv)を使って欠損値の処理の例を書いていきます

いつも通り、read_csv()メソッドを使ってCSVファイルを読み込みました。

(CSVファイルの読み込み方が分からない方は[こちらの記事](https://qiita.com/Mayumi_Pythonista/items/c29197abd4af408a8d17)を参考にどうぞ)

実行結果は以下のようになります




![スクリーンショット 2021-03-18 111821.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/f843f16a-5926-fa09-80ef-97079e03e121.jpeg)

2003年から2017年までのデータなので、かなり膨大なrowの数値になっています。

データのところどころに書いてある<font color="Red">『NaN』が欠損値</font>を表しています。

#dropna()メソッド

![スクリーンショット 2021-03-18 113149.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/a78b5c58-b85f-a343-8545-fb84f0cbc780.jpeg)
引用元：[Pandasドキュメント](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.dropna.html)

dropna()メソッドはPandasドキュメントに書いてあるように様々なパラメーターを取ることができます。

このパラメーターにどのような引数を取るかで、削除の仕方が変わってきますので、それぞれのパラメーターを一つづつ説明していきますね。


では具体的にコードを書きながら説明します


##dropna() メソッドのパラメーター　how

![スクリーンショット 2021-03-18 114645.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/016acb25-8a27-ae49-68fb-a57cfe413c50.jpeg)


パラメーターhow には引数に　

>"any" か

>"all"　を取ることができます

"any"は<font color="Red">『どんな欠損値でもある限りは』ということを意味し</font>、『NaN』が一つでも存在する row は削除されます。


上の実行結果のスクショを見ていただくと分かると思いますが、インデックス番号530649には　『NaN』が一つ以上存在しているので、コードの実行結果では、そのrow　が削除されています


次に、引数を"all"　にした場合を説明します。

"all"を引数に取ると、<font color="Red">row の全ての項目が『NaN』ではない限り、削除されることはありません。</font>
コラム名で言うと、右端の『TYPE』から左端の『LONGTITUDE』まで全てが『NaN』の場合のことです。



##パラメーターsubset


例えば、今回のデータでコラム名が『"NEIGHBOURHOOD"』に欠損値があるデータは削除したいけど、他のコラムに欠損値があっても使いたいとします

そのような時にsubsetの引数に『"NEIGHBOURHOOD"』とコラム名を書きます

『"NEIGHBOURHOOD"』以外のコラムに『NaN』があっても、そのrow は削除されません。

![スクリーンショット 2021-03-19 062257.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/5c639690-92ee-5f97-95a7-7b3a1b59403a.jpeg)


##パラメーターinplace

inplace は[こちらの記事](https://qiita.com/Mayumi_Pythonista/items/788af7b3f8bd2658f6f2#inplace-%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%83%BC%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9)でも詳しく説明しています。

inplace = False がデフォルト値であり、デフォルトではinplace されません。

そのinplace とはどういうことかというと、元々のオリジナルのDataFrame をdropna() で<font color="Red">実行した結果で上書きする</font>というパラメーターです。


例を取って説明します

![スクリーンショット 2021-03-19 063353.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/22f85858-9ce3-2ca7-6021-afd7ce358819.jpeg)

ただ、

```
inplace= True
```

に変えますと、下記のようになります

![スクリーンショット 2021-03-19 063651.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/a13e31c6-6e9d-aef6-a8a5-8b6be36a4660.jpeg)

##パラメーターaxis

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/06b8cb17-12ed-af38-a4e0-365378f80837.png)


axis は軸のことで、デフォルト値0はインデックスを表します。

```
axis=1
```

に変えますと、<font color="Red">軸が縦方向に変わり</font>、コラムのなかに『NaN』があるかどうかをPandas が探してくれて、そのコラムを削除してくれます。


![スクリーンショット 2021-03-19 070458.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/9a6bba4c-e41b-537c-53ac-9826543f3eef.jpeg)

columns の数が、8まで減っています


欠損値があるrow やcolumnを削除する方法はこれくらいで終わりにします。

では次に、削除するのではなく、『欠損値だと分かるように何かで穴埋めしたい時』はどうしたら良いのでしょうか？

その方法を次に書いていきますね。

#fillna()メソッド

![スクリーンショット 2021-03-19 072215.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/937aa3bb-000c-5121-81c8-368d1c07e50e.jpeg)
引用元：[Pandasドキュメント](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.fillna.html)

<font color="Red">NA/NaNの値になっている部分を埋めてくれます。</font>


![スクリーンショット 2021-03-19 072028.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/e8d22abc-acda-c515-1736-fbedaaa52437.jpeg)

上記のスクショには、コラム名『HOUR』『MINUTE』『NEIGHBORHOOD』に『NaN』の欠損値をもつrow があります。

ただ、HOUR や　MINUTE は　『0』で穴埋めしたいけど『NEIGHBORHOOD』は『UNKNOWN』と穴埋めしたいとします。

![DataFrame名[_コラム名_].fillna(埋めたい数値or文字列).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/056a9ff6-ee9e-b588-d53c-b979472dc915.png)

ただこのままですと、オリジナルのDataFrameを呼び出した時には、また元のデータに戻ってしまうので、パラメーターinplace = True とします

実行結果は下のようになります


![スクリーンショット 2021-03-19 073712.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/a8c20fbe-acf6-a57b-6bf9-d75f94d72663.jpeg)

さらに、NEIGHBORHOOD のNaN をunknown にして欠損値を穴埋めします

![スクリーンショット 2021-03-19 074057.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/d01ee26b-f768-193d-ba83-27de7562d8ed.jpeg)

<font color="Red">HOURの欠損値が0で上書きされたまま</font>、さらにNEIGHBOURHOOD の欠損値も書き換えることができました。


#まとめ

今回は欠損値の処理の仕方を色々と集めてみました。

次回の記事では、データの並べ替えについて書いていきたいと思います