web-dev-qa-db-fra.com

Pandas dataframe: ValueError: num doit être 1 <= num <= 0, pas 1

J'obtiens l'erreur suivante pendant que j'essaie de tracer un pandas dataframe:

ValueError: num doit être 1 <= num <= 0, pas 1

Code:

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()

J'ai essayé de relire le fichier à partir du csv et j'obtiens exactement la même erreur.

Éditer:

print x_train production:

[[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,33333333333333333 0,33333333333333333 2,0 2,0 2,0 2,0]

[0,0 0,0 3,0 3,0 3,0 3,0]]

Edit2:

Liste complète des erreurs (Traceback):

Traceback (dernier appel le plus récent):

Fichier "temp.py", ligne 104, dans custom.dropna (). Hist ()

Fichier "/home/kostas/anaconda2/lib/python2.7/site-packages/pandas/tools/plotting.py", ligne 2893, dans hist_frame layout = layout)

Fichier "/home/kostas/anaconda2/lib/python2.7/site-packages/pandas/tools/plotting.py", ligne 3380, dans _subplots ax0 = fig.add_subplot (nrows, ncols, 1, ** subplot_kw)

Fichier "/home/kostas/anaconda2/lib/python2.7/site-packages/matplotlib/figure.py", ligne 1005, dans add_subplot a = subplot_class_factory (projection_class) (self, * args, ** kwargs)

Fichier "/home/kostas/anaconda2/lib/python2.7/site-packages/matplotlib/axes/_subplots.py", ligne 64, en init maxn = lignes * cols, num = num) )

14
KostasRim

Je suis donc presque sûr que votre problème est lié au format du tableau train_x. J'ai essayé votre programme avec un tableau de 10 000 lignes et 6 colonnes et cela a bien fonctionné, donc le problème n'est pas la taille. Pour une raison quelconque, l'un des len(x_train) ou len(x_train[0]) est 0. Ce qui me fait penser que c'est ainsi:

L'erreur ValueError que vous obtenez provient du module matplotlib.axes._subplot qui traite du dessin de nombreux petits sous-tracés dans un grand tracé (donc chaque petit histogramme). Le code du module est le suivant:

""" 
*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))

Votre problème est dans cette partie (voir l'explication dans les commentaires dans le code):

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

Je ne sais pas comment vous lisez votre format d'entrée, mais je suis sûr que le problème y est lié. Si vous définissez x_train sur cela, cela fonctionne très bien:

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

Essayez de faire cela avant d'appeler le code dans votre question et voyez si cela fonctionne:

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

J'ai eu le même problème et j'ai trouvé que cela était dû au fait que le tableau NumPy était un tableau d'objets plutôt qu'un tableau flottant.

Essaye ça:

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