変数の値が数値かどうかを確認する方法は用途によっていくつかある。
変数を1つずつ数値かどうか確認する方法とpandasを使って確認する方法を紹介。
確認対象がリストとしてたくさんある場合、forで1個ずつやるよりも、リスト内包表記、もしくはpandasを使った方が早い気がする。
floatを使う方法
1個ずつ確認する場合、pythonの組み込み関数のfloat()を使うと、floatとして扱えるかどうかを確実に確認できる。
負の値や小数点を含む値、全角の数字も数値として判別される。
漢数字は数値として判別されない。
def is_num(x):
try:
float(x)
except ValueError:
return False
else:
return True
nums = [0, 1, -2, 3.0, "-", "0", "1", "-2", "3.0", "4", "五", "a", ]
for num in nums:
print(is_num(num))
>>
True
True
True
True
False
True
True
True
True
True
False
False
int()にすると小数点を含む数値はエラー側になる。
float()を使うと小数点を含む数値も数値と判断できる。
リストとしてまとめて処理したい場合はこんな感じになる。
[is_num(num) for num in nums]
>>
[True, True, True, True, False, True, True, True, True, True, False, False]
簡単で確実な方法だが、データ量が多くなるとfor文での処理は時間がかかる。
isnumericを使う場合
strのisnumericを使う場合、文字列が0以上の整数かどうかを判別できる。
漢数字も数値として判別される。
[str(num).isnumeric() for num in nums]
>>
[True, True, False, False, False, True, True, False, False, True, True, False]
小数は数値として判別されないので注意が必要。
pandasのread_csvなどでデータを読み込んだ際に、値にNanが含まれている場合は他の値が全て整数だったとしてもintではなくfloatとなり、各整数に「.0」が付加される。
この状態でisnumericするとFalseが返ってくる。
他にもisdigit, isdecimalなどがあり、それぞれ判別できる値が異なるので目的に応じて使い分ける。
pandasのto_numericを使う場合
pandasのto_numericとnotna, isnaを使うことでpandasで数値として扱うことができるかどうかを確認することができる。
sr_num = pd.Series(nums)
pd.to_numeric(sr_num, errors="coerce").notna()
>>
0 True
1 True
2 True
3 True
4 False
5 True
6 True
7 True
8 True
9 False
10 False
11 False
errorsにcoerceを指定することで数値に変換できない値はnaになる。
notnaを使えば数値変換できた値がTrueになる。
isnaを使えば数値変換できなかった値がTrueになる。
全角の数は数値として扱われない。
半角の負の値や小数は数値として扱える。
あまり使う機会がないかもしれないが、たまにTrue/Falseで欲しくなる時もあるので、まとめて処理できると便利。