データ分析をする際、CSV形式でデータが保存されている場合、pandasで read_csv 関数により、データをロードする。
pandasでは、値が欠けているセルを自動的に検出し、NaNを入れてくれる。
データに欠損値があるかどうかをロード後に確認してもいいが、データロード時に利用できる様々なオプションがある。
- keep_default_na
- na_values
- na_filter
である。
以下サンプルCSVである。Favoriteのカラムには何らかの趣味を示す文字列が入って欲しいが、ダミーとして欠損値や0にしている。
"Name","Gender","Favorite"
"Alice","F","Guitar"
"Bob","M","Music"
"Carol","F",
"Cary","M","Nothing"
"Dave","M",0
オプションの指定がない場合は以下のようになる。
pd.read_csv("./test/users.csv")
| Name | Gender | Favorite | |
|---|---|---|---|
| 0 | Alice | F | Guitar |
| 1 | Bob | M | Music |
| 2 | Carol | F | NaN |
| 3 | Cary | M | Nothing |
| 4 | Dave | M | 0 |
keep_default_na
これはデフォルトではTrue指定されているもので、NaNのような欠損値のリストを使用するかどうかを指定するものだ。
Falseにすると指定しないためNaNが利用されない。
pd.read_csv("./test/users.csv", keep_default_na=False)
| Name | Gender | Favorite | |
|---|---|---|---|
| 0 | Alice | F | Guitar |
| 1 | Bob | M | Music |
| 2 | Carol | F | |
| 3 | Cary | M | Nothing |
| 4 | Dave | M | 0 |
na_values
na_values は、利用者側で欠損値となる値を決めることが可能だ
pd.read_csv("./test/users.csv", na_values=[0]) # この場合0に欠損値リストが利用される。
| Name | Gender | Favorite | |
|---|---|---|---|
| 0 | Alice | F | Guitar |
| 1 | Bob | M | Music |
| 2 | Carol | F | NaN |
| 3 | Cary | M | Nothing |
| 4 | Dave | M | NaN |
keep_default_na との併用も可能だ。
pd.read_csv("./test/users.csv", keep_default_na=False, na_values=['', 0])
| Name | Gender | Favorite | |
|---|---|---|---|
| 0 | Alice | F | Guitar |
| 1 | Bob | M | Music |
| 2 | Carol | F | NaN |
| 3 | Cary | M | Nothing |
| 4 | Dave | M | NaN |
Nothing という趣味がないということを意図してそうな入力も一応欠損値にできる
pd.read_csv("./test/users.csv", keep_default_na=False, na_values=['', 0, "Nothing"])
| Name | Gender | Favorite | |
|---|---|---|---|
| 0 | Alice | F | Guitar |
| 1 | Bob | M | Music |
| 2 | Carol | F | NaN |
| 3 | Cary | M | NaN |
| 4 | Dave | M | NaN |
na_filter
欠損値を判定し、読み込むかどうかをきめるものだ。
pd.read_csv("./test/users.csv", na_filter=True)
| Name | Gender | Favorite | |
|---|---|---|---|
| 0 | Alice | F | Guitar |
| 1 | Bob | M | Music |
| 2 | Carol | F | NaN |
| 3 | Cary | M | Nothing |
| 4 | Dave | M | 0 |
pd.read_csv("./test/users.csv", na_filter=False)
Falseの場合データをそのまま読み込む。
| Name | Gender | Favorite | |
|---|---|---|---|
| 0 | Alice | F | Guitar |
| 1 | Bob | M | Music |
| 2 | Carol | F | |
| 3 | Cary | M | Nothing |
| 4 | Dave | M | 0 |
まとめ
読み込み時にこのようなオプションを駆使することで、前処理の手間も少し改善できるだろう