【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],"です。")
ディスカッション
コメント一覧
まだ、コメントがありません