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


94

私はパンダreadcsv()を使用してcsvファイルの2つの列を読み取り、その値を辞書に割り当てています。列には数字と文字の文字列が含まれます。セルが空の場合があります。私の意見では、そのディクショナリー項目に読み取られる値は、割り当てられるべきですがNone、代わりnanに割り当てられるべきです。確かNoneに、空のセルはnull値を持っているので、よりわかりやすくなりますが、nan読み取られた値は数値ではないというだけです。

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

また、空のセルがないか私の辞書チェックで使用されていnumpy.isnan()ます:

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

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


テキストqwertyは数字ではありません。
ロバートハーベイ

1
@RobertHarvey私は知っているのでNone、空のセルの値のより良い説明になるでしょう。
user1083734 2013

回答:


107

NaNのためのプレースホルダとして使用されているデータが欠落一貫パンダで、一貫性が良好です。私は通常、NaNを"missing"として読み取り/変換します。ドキュメントの「欠損データの操作」セクションもご覧ください。

Wesはドキュメントに「NA表現の選択」と書いています。

長年の生産使用の後、少なくとも私の意見では、[NaN]はNumPyとPythonの一般的な状況を考えると最良の決定であることが証明されています。特別な値NaN(Not-A-Number)はNA値としてあらゆる場所で使用され、dtype全体でNA値を検出するために使用できるAPI関数がisnullありnotnullます。
...
したがって、Pythonの「実用性は純粋さを打つ」アプローチを選択し、整数NA機能をトレードして、浮動小数点数とオブジェクト配列で特別な値を使用してNAを示し、整数配列をNAにする必要があるときに浮動小数点数に浮動小数点に昇格させる導入されました。

注:欠落しているデータを含む整数のSeriesがfloatにアップキャストされる「問題」

私の意見では、NaN(Noneよりも)を使用する主な理由は、効率の悪いオブジェクト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ベクトル化された操作を可能にします。そのfloat値は、None定義により、オブジェクトタイプを強制し、基本的にnumpyのすべての効率を無効にします。

したがって、3回高速に繰り返します。object== bad、float == good

それでも、多くの操作はNoneとNaNでも同じように機能する可能性があります(ただし、サポートされていない可能性があります。つまり、予期しない結果になる場合があります)。

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

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

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


19
ここに2cを追加するだけでnp.nan、ベクトル化された操作が可能になります。一方、そのA float値、None定義部隊のでobjectタイプ、および基本的にnumpyの中のすべての効率化を無効にし、非常に高速3回繰り返す:object==bad, float==good
ジェフ

1
である<NA>にもnp.nan
ガチド

18

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

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

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

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

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

numpyのは、次のようなあなたの結果、汚染しNaN値を避けるために、いくつかの機能を持っているnansumと、nan_to_numたとえば。


存在しないエントリにはNoneを使用するべきだと私は同意します。なぜ空のセルではなく、空のセルの値をdf=pd.readcsv('file.csv')与えるのですか?私の知る限り、pd.DataFramesは数値専用ではありません。NaNNone
user1083734 2013

まあ、それはおそらく設計上の選択です。私は、データフレームを想定し、シリーズは持っているdtypeのため、無効な値をdtype=float数値で表現しなければならないNaNし、None(ではないNoneのですNoneType)。
Heltonbiker 2013

また、多くのPandasメソッドにはna引数があり、使用できない値を置き換えるために使用する値を決定できます
heltonbiker

わかりました。したがって、実際にはDataFrameに数値を読み取るのではなく、数字と文字の文字列を読み取ります。空のセルを検出するには、どのようなチェックを使用する必要がありますか?チェックのような; dtype == floatの場合:??
user1083734 2013

おそらく、CSVデータのサンプルを投稿すると役立つでしょう。文字列がある場合、dtypeは列全体(シリーズ)の文字列になると想像できます。しかし、すべての行が同じ数の列を持っているわけではない場合でも、データが利用できなくなることになります。確認する必要があると思います。
heltonbiker 2013

3

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

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

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


1
2はNaNではないので、isnan(2)返されると思いますFalse
Heltonbiker 2013

また、numpy.empty配列値をに初期化しませんNaN。単に値を初期化しないだけです。
Heltonbiker 2013

5
None-ness の適切なチェックはmyVar is not None、ではありませんmyVar != None
Jaime

3
np.isnan()あなたは、文字列を渡した場合、それがクラッシュしますので、文字列変数のために実装されていません。pd.isnull文字列で動作する使用する方が良いです。
Michael

-1

違いは次のとおりです。

  • nan クラスに属している float
  • None クラスに属している NoneType

私は以下の記事が非常に役に立ったと感じました:https : //medium.com/analytics-vidhya/dealing-with-missing-values-nan-and-none-in-python-6fc9b8fb4f31


このリンクで質問に答えることができますが、回答の重要な部分をここに含め、参照用のリンクを提供することをお勧めします。リンクされたページが変更されると、リンクのみの回答が無効になる可能性があります。- レビューから
A. Kootstra

@ A.Kootstraわかりました
eswara amirthan s

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.