web-dev-qa-db-ja.com

NaNとNoneの違いは何ですか?

pandas readcsv()を使用してcsvファイルの2つの列を読み込んでから、値を辞書に割り当てています。列には数字と文字の文字列が含まれます。セルが空の場合があります。私の意見では、その辞書エントリに読み込まれる値はNoneである必要がありますが、代わりにnanが割り当てられます。 Noneは、空のセルの値がnullであるため、より説明的です。一方、nanは、読み取った値が数値ではないことを示しているだけです。

私の理解は正しいですか、IS Nonenanの違いは何ですか? nanの代わりにNoneが割り当てられているのはなぜですか?

また、空のセルの辞書チェックではnumpy.isnan()を使用しています。

for k, v in my_dict.iteritems():
    if np.isnan(v):

しかし、これにより、vに対してこのチェックを使用できないというエラーが表示されます。これは、文字列ではなく整数または浮動小数点変数が使用されるためだと思います。これが当てはまる場合、「空のセル」/ vケースについてnanを確認するにはどうすればよいですか?

78
user1083734

NaNは、 パンダではデータの欠落consistently のプレースホルダーとして使用され、一貫性は良好です。私は通常、NaNを "missing"として読み取り/翻訳します。 また、ドキュメントの 「欠落データの処理」 セクションも参照してください。

Wesはドキュメントに書き込みます 'NA-representationの選択'

少なくとも私の意見では、長年の生産使用の後、[NaN]がNumPyとPython全般の状況を考えると最良の決定であることが証明されました。特別な値NaN(Not-A-Number)がNA値としてeverywhereに使用され、API関数 isnull および notnullがあります これは、dtype全体でNA値を検出するために使用できます。
...
このように、Pythonの「実用性が純粋さを上回る」アプローチを選択し、NAを示すためにfloatおよびオブジェクト配列で特別な値を使用し、NA導入する必要があります。

注: "gotcha"欠損データを含む整数シリーズは浮動小数点数にアップキャストされます

私の意見では、NaN(なし)を使用する主な理由は、効率の低いオブジェクトdtypeではなく、numpyのfloat64 dtypeで保存できることですNAタイププロモーション

#  without forcing dtype it changes None to NaN!
s_bad = pd.Series([1, None], dtype=object)
s_good = pd.Series([1, np.nan])

In [13]: s_bad.dtype
Out[13]: dtype('O')

In [14]: s_good.dtype
Out[14]: dtype('float64')

ジェフはこれについて(以下)コメントしています:

np.nanは、ベクトル化された操作を許可します。それはフロート値であり、Noneは定義によりオブジェクト型を強制します。これは基本的にnumpyのすべての効率を無効にします。

だから、3回速く繰り返します:object == bad、float == good

そうは言っても、多くの操作は、None vs NaNでも同様に機能する可能性があります(ただし、サポートされていない可能性があります。つまり、 驚くべき結果 )。

In [15]: s_bad.sum()
Out[15]: 1

In [16]: s_good.sum()
Out[16]: 1.0

2番目の質問に答えるには:
pd.isnull および pd.notnull を使用して、欠落データ(NaN)をテストする必要があります。

88
Andy Hayden

NaNは数学演算で数値として使用できますが、Noneは使用できません(または少なくとも使用しないでください)。

NaNは、 IEEE 754浮動小数点標準 で定義されている数値です。 Noneは内部Python tipe(NoneType)であり、このコンテキストでは「数値的に無効」ではなく「不在」または「空」に似ています。

その主な「症状」は、NaNを含む配列に対して、たとえば1つでも平均または合計を実行すると、結果としてNaNが得られることです...

一方、オペランドとしてNoneを使用して数学演算を実行することはできません。

そのため、場合によっては、計算で無効または存在しない値を考慮しないようにアルゴリズムに指示する方法として、Noneを使用できます。つまり、アルゴリズムは各値をテストして、Noneであるかどうかを確認する必要があります。

Numpyには、たとえばnansumnan_to_numなど、結果を汚染するNaN値を回避するための関数がいくつかあります。

15
heltonbiker

関数 isnan() は、何かが「数値ではない」かどうかを確認し、変数が数値であるかどうかを返します。たとえば、isnan(2)はfalseを返します。

条件付きmyVar is not Noneは、変数が定義されているかどうかを返します

Numpy配列はisnan()を使用します。これは、数値の配列であることが意図されており、配列のすべての要素をNaNに初期化するためです。これらの要素は「空」と見なされます

3
Stephan