2016-09-03 1 views
2

pandas.core.series.NanのNaN型の型に対してmax()とmin()を使用するとどうなりますか?これはバグですか?あなたが代わりにバニラPythonのもののパンダまたはnumpyの機能を使用する必要がありますNaNを持つPandas Seriesデータ型を扱うにはどうすればよいですか?


%matplotlib inline 
import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt 

mydata = pd.DataFrame(np.random.standard_normal((100,1)), columns=['No NaN']) 
mydata['Has NaN'] = mydata['No NaN']/mydata['No NaN'].shift(1) 

# Both return NaN! 
print(min(mydata['Has NaN']), max(mydata['Has NaN'])) 
# Still why False? Isn't float('nan') a singleton like None? 
print(min(mydata['Has NaN']) == max(mydata['Has NaN'])) 
# But this time works well! 
print(min([1, 2, 3, float('nan')])) 

print('\n') 

# When Series data type that has NaN bumps into min() and max(), what should 
# I do? E.g., 
try: 
    n, bins, patches = plt.hist(mydata['Has NaN'], 10) 
except ValueError as e: 
    print(e, '\nSeems "range" argument in hist() has problem!') 

答えて

3

まず、あなたは、ビルトインのPythonを使用しないでくださいpandasまたはnumpyを扱う場合、特にnanを使用している場合は、maxまたはminとなります。

「NaNが」(docsで述べたように)ので、それはmax又はminのいずれかで置換されることはない、mydata['Has NaN']の最初の項目であるので:

非数は、フロート( 'のNaN値')とDecimal(' NaN ')は特別です。 これらはそれ自身と同じですが(xはxが真です)、 とは等しくありません(x == xはfalse)。さらに、任意の数値を 数値でない値と比較すると、Falseが返されます。たとえば、float( 'NaN')とfloat( 'NaN')< 3の両方がFalseを返します。

代わりに、pandasmaxminメソッドを使用します。ヒストグラムに関して

In [4]: mydata['Has NaN'].min() 
Out[4]: -176.9844930355774 

In [5]: mydata['Has NaN'].max() 
Out[5]: 12.684033138603787 

を、herehereを参照してください、これはplt.histの既知の問題であるようです。

今のところ、しかしに対処することはかなり簡単です:

n, bins, patches = plt.hist(mydata['Has NaN'][~mydata['Has NaN'].isnull()], 10) 

enter image description here

+0

面白いですが、なぜ 'plt.hist()'が動かないのですか? [matplotlib docs](http://matplotlib.org/api/pyplot_api.html)に記載されているように、関数hist()のrangeパラメータはデフォルトで(x.min()、x.max())です。だからそれはうまくいく! – Nicholas

+0

ところで、私はあなたがページの上部ではなく関連する部分に直接ジャンプを提供した** docs **リンクに気付きました。それは上品です!リンクに関連付けられたURLにどのようなトリックをしましたか? – Nicholas

+1

@Nicholas申し訳ありません、 'plt.hist'についてのあなたのオリジナルの質問を読んだのですが、実際はバグだと思います!私の編集を参照してください。 –

3

、以下を参照してください:

In [7]: mydata['Has NaN'].min(), mydata['Has NaN'].max() 
Out[7]: (-46.00309057827485, 62.430829637766671) 

In [8]: min(mydata['Has NaN']), max(mydata['Has NaN']) 
Out[8]: (nan, nan) 

In [125]: mydata.plot.hist(alpha=0.5) 
Out[125]: <matplotlib.axes._subplots.AxesSubplot at 0x1a784588> 

enter image description here

+0

おかげで、まだしないのはなぜ 'plt.hist()'の仕事? [matplotlib docs](http://matplotlib.org/api/pyplot_api.html)に記載されているように、関数hist()のrangeパラメータはデフォルトで(x.min()、x.max())です。だからそれはうまくいく! – Nicholas

+0

@Nicholas、「なぜplt.hist()は動作しないのですか? 'pandas.plot.hist'は私のためにうまくいきます - 更新された答えを見てください... – MaxU

+0

あなたはpandasモジュールを使用しています。 'import matplotlib.pyplot as plt'と' plt.hist() 'を試してください。しかし、私はjuanpa.arrivillagaはすでに問題を発見したと思う。 – Nicholas

関連する問題