当サイトではアフィリエイト広告を利用しています。

【Python】if文で空値(NaN)を「==(完全一致)」で判定させることが出来ないときの対処方法

Pythonでif文を使って空値(NaN)を判定させるとき、以下の様に「==」で判定させてませんか?

if name_list[i] == 'nan':

この場合、name_listというリストの中の値がnanであったとしても、ifの条件に引っかけることが出来ません。

実演

例として以下のCSVの「name」列に空値(nan)があったら「x行目のフルーツは空値になっています。」と出力してみます。

CSVデータ(fruit.csv)

name,num
apple,80
,23
grape,45
banana,0

nan判定コード

fruit.csvのname列にnan値が無いかをif文の「==(完全一致)」で判定するコード

※name列のリストをname_listに格納しています。

name_listの中身→['apple', nan, 'grape', 'banana']

#~~CSVデータ読み込みとname列のみを変数name_listに代入する部分を省略~~

for i in range(0,4,1):
 if name_list[i] == 'nan':
  print(i+1,"行目のフルーツは空値になっています。")
else:
  print(i+1,"行目のフルーツは",name_list[i],"です。")

nan判定コードの全文は最下部の「参考」をご覧ください。

出力結果

理想とされる出力結果

1 行目のフルーツは apple です。
2 行目のフルーツは空値になっています。
3 行目のフルーツは grape です。
4 行目のフルーツは banana です。

実際の出力結果

1 行目のフルーツは apple です。 
2 行目のフルーツは nan です。 
3 行目のフルーツは grape です。 
4 行目のフルーツは banana です。

残念なことに空値となっている2行目も「nanという文字列が入っている」と判断されてしまっています。

もしif文のnanを囲っているクオーテーションを外し、「if name_list[i] == nan:」にした場合は以下の様にNameErrorとなってしまいます。

NameError: name 'nan' is not defined

対処方法

これを解決するにはif文の判定内容を以下の様に変更する必要があります。
正しい判定方法はいくつかありますが、せっかくなので今回はpandasを使って判定してみます。

pandasを使って判定する際のif文は以下になります。

if pd.isnull(name_list[i]) :

if name_list[i] == 'nan':」の部分を上記に書き換えます。

if文書き換え後の出力結果

1 行目のフルーツは apple です。
2 行目のフルーツは空値になっています。 
3 行目のフルーツは grape です。 
4 行目のフルーツは banana です。

きちんと2行目を空値(nan)として判定し、「2 行目のフルーツは空値になっています。」と出力することが出来ました!!

参考

今回の失敗再現用に作成したコード全文です。

import pandas as pd

#CSVファイルをdfに読み込み、dfからname列を抽出する
df = pd.read_csv("fruit.csv")
name_list= list(df['name'])

#name_listを1行目から順にnanを判断し、フルーツ名を出力する
for i in range(0,4,1):
 if name_list[i] == 'nan':
  print(i+1,"行目のフルーツは空値になっています。")
 else:
  print(i+1,"行目のフルーツは",name_list[i],"です。")