web-dev-qa-db-ja.com

Pandas dataframe:ValueError:numは1 <= num <= 0でなければならず、1ではありません

pandas dataframeをプロットしようとすると、次のエラーが表示されます。

ValueError:numは1ではなく1 <= num <= 0でなければなりません

コード:

import matplotlib.pyplot as plt

names = ['buying', 'maint', 'doors', 'persons', 'lug_boot', 'safety']
custom = pd.DataFrame(x_train)  //only a portion of the csv
custom.columns = names
custom.hist()
plt.show()

csvからファイルを再度読み取ろうとしましたが、まったく同じエラーが発生しています。

編集:

print x_train出力:

[[0.0 0.0 0.0 0.0 0.0 0.0]

[1.0 1.0 0.0 0.0 0.0 0.0]

[0.0 0.0 0.0 0.0 0.0 0.0]

...、

[0.0 0.0 0.0 0.0 0.0 0.0]

[0.3333333333333333 0.3333333333333333 2.0 2.0 2.0 2.0]

[0.0 0.0 3.0 3.0 3.0 3.0]]]

編集2:

エラーの完全なリスト(トレースバック):

トレースバック(最後の最後の呼び出し):

Custom.dropna()。hist()のファイル「temp.py」、104行目

ファイル「/home/kostas/anaconda2/lib/python2.7/site-packages/pandas/tools/plotting.py」、行2893、hist_frame layout = layout内)

ファイル「/home/kostas/anaconda2/lib/python2.7/site-packages/pandas/tools/plotting.py」、行3380、_subplots ax0 = fig.add_subplot(nrows、ncols、1、** subplot_kw)

ファイル「/home/kostas/anaconda2/lib/python2.7/site-packages/matplotlib/figure.py」、行1005、add_subplot a = subplot_class_factory(projection_class)(self、* args、** kwargs)

ファイル「/home/kostas/anaconda2/lib/python2.7/site-packages/matplotlib/axes/_subplots.py」、64行目、init maxn = rows * cols、num = num) )

12
KostasRim

ですから、あなたの問題はtrain_x配列のフォーマットに関係していると確信しています。 10,000行と6列の配列でプログラムを試しましたが、問題はサイズではないのでうまくいきました。何らかの理由で、len(x_train)またはlen(x_train[0])のいずれかが0です。

取得しているValueErrorはmatplotlib.axes._subplotモジュールからのもので、大きなプロット内に小さなサブプロットを描画することを処理します(したがって、各小さなヒストグラム)。モジュールのコードは次のとおりです。

""" 
*rows*, *cols*, *num* are arguments where
the array of subplots in the figure has dimensions *rows*,
*cols*, and where *num* is the number of the subplot
being created. *num* starts at 1 in the upper left
corner and increases to the right.
"""
rows, cols, num = args
rows = int(rows)
cols = int(cols)
if isinstance(num, Tuple) and len(num) == 2:
    num = [int(n) for n in num]
    self._subplotspec = GridSpec(rows, cols)[num[0] - 1:num[1]]
else:
    if num < 1 or num > rows*cols:
        raise ValueError(      
            "num must be 1 <= num <= {maxn}, not {num}".format(
                maxn=rows*cols, num=num))

問題はこの部分にあります(コードのコメントの説明を参照)。

    if num < 1 or num > rows*cols:
     # maxN is the number of rows*cols and since this is showing 0 for you (in your error stacktrace), 
     # it means the number of cols being passed into your histogram is 0. Don't know why though :P
        raise ValueError(      
            "num must be 1 <= num <= {maxn}, not {num}".format(
                maxn=rows*cols, num=num))

入力フォーマットの読み方はわかりませんが、問題はそれに関連していると確信しています。 x_trainをこれに設定すると、うまくいきます:

    x_train =   [[0.0, 0.0, 0.0, 0.0, 0.0, 0.0],

                [1.0, 1.0, 0.0, 0.0, 0.0, 0.0],

                [0.0, 0.0, 0.0, 0.0, 0.0, 0.0],

                [0.0, 0.0, 0.0, 0.0, 0.0, 0.0],

                [0.3333333333333333, 0.3333333333333333, 2.0, 2.0, 2.0, 2.0],

                [0.0, 0.0, 3.0, 3.0, 3.0, 3.0]]

あなたの質問のコードを呼び出す前にこれを試してみて、それが機能するかどうかを確認してください:

x_train = list([list(x) for x in x_train])
3
gowrath

私は同じ問題を抱えていましたが、これはNumPy配列がfloat配列ではなくオブジェクト配列であることに起因していることがわかりました。

これを試して:

x_train = x_train.astype(np.float)
13
MiniQuark