1. ホーム
  2. python

[解決済み] Pandasのデータフレームです。ValueError: num は 1 <= num <= 0 でなければならず、1 ではありません。

2022-02-17 18:01:03

質問

をプロットしようとすると、以下のエラーが発生します。 pandas dataframe :

ValueError: num must be 1 <= num <= 0, not 1

コード

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]]

Edit2です。

エラーの完全なリスト(Traceback)。

<ブロッククオート

トレースバック(直近の呼び出し)。

ファイル "temp.py", 行 104, in カスタム.ドロップナ().ヒスト()

ファイル "/home/kostas/anaconda2/lib/python2.7/site-packages/pandas/tools/plotting.py", 行 2893, in 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, in add_subplot a = subplot_class_factory(projection_class)(self, *args, **kwargs)

ファイル "/home/kostas/anaconda2/lib/python2.7/site-packages/matplotlib/axes/_subplots.py", 行 64, in イニット maxn=rows*cols, num=num))です。

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

つまり、あなたの問題は、配列 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])