1. ホーム
  2. python

[解決済み] NaNとNoneの違いは何ですか?

2022-07-26 19:43:43

質問

pandasを使ってcsvファイルの2列を読み込んでいます。 readcsv() を使用してcsvファイルを読み込み、その値を辞書に代入しています。列には数字と文字の文字列が含まれています。時折、セルが空の場合があります。私の考えでは、その辞書エントリに読み込まれる値は、以下のようになるはずです。 None であるべきですが、代わりに nan が割り当てられています。確かに None は空の値を持つので、空のセルをより明確に表現しています。 nan は読み取った値が数値でないことを示すだけです。

私の理解は正しいでしょうか? Nonenan ? なぜ nan の代わりに None ?

また、空のセルがあるかどうかの辞書チェックは、これまで numpy.isnan() :

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

しかし、これは、このチェックを v . 文字列ではなく、整数や浮動小数点数の変数が使われることを意味しているからでしょう。もしそうだとすると、どうすれば v をチェックするにはどうしたらよいでしょうか。 nan のようなケースはありませんか?

どのように解決するのですか?

NaNは、プレースホルダーとして 欠損データ 一貫して pandasでは というように、一貫性を持たせるのは良いことです。私は通常、NaNを次のように読み、翻訳しています。 行方不明 . も参照してください。 '欠損データとの連携' セクションも参照してください。

Wesはdocsに書いている 'NA-representationの選択' :

何年にもわたる実運用での使用の後、[NaN]は、少なくとも私の意見では、NumPyとPython全般の状況を考えると最良の決定であることが証明されています。特殊な値NaN (Not-A-Number) が使用されます。 どこでも をNA値として使用し、API関数の isnull notnull というように、dtypes 全体で NA 値を検出するために使用することができます。

...

したがって、私は Pythonic な "実用性は純粋さに勝る" というアプローチを選択し、整数の NA 機能と引き換えに、NA を示すために float およびオブジェクト配列の特別な値を使用し、NA を導入しなければならないときは整数配列を float に昇格するという、より単純なアプローチに変更しました。

欠測を含む整数の系列は浮動小数点にアップキャストされるということです。 .

私の考えでは、(Noneではなく)NaNを使用する主な理由は、効率の悪いobject d型ではなく、numpyのfloat64 d型で格納できることです。 参照 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回繰り返す:オブジェクト==悪い、浮動小数点==良い

とはいえ、多くの操作は 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)をテストします。