Pandas 数据框:ValueError:num 必须为 1 <= num <= 0,而不是 1
Posted
技术标签:
【中文标题】Pandas 数据框:ValueError:num 必须为 1 <= num <= 0,而不是 1【英文标题】:Pandas dataframe: ValueError: num must be 1 <= num <= 0, not 1 【发布时间】:2017-01-03 23:41:00 【问题描述】:我在尝试绘制 pandas dataframe
时遇到以下错误:
ValueError: num 必须是 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]]
编辑2:
完整的错误列表(Traceback):
Traceback(最近一次调用最后一次):
文件“temp.py”,第 104 行,在 custom.dropna().hist()
文件“/home/kostas/anaconda2/lib/python2.7/site-packages/pandas/tools/plotting.py”,第 2893 行,在 hist_frame 布局=布局)
文件“/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)
init 中的文件“/home/kostas/anaconda2/lib/python2.7/site-packages/matplotlib/axes/_subplots.py”,第 64 行 maxn=rows*cols, num=num))
【问题讨论】:
你能显示x_train
包含的内容吗?
@gowrath 它是一个 numpy
数组,包含标准化的浮点数[0...1](它有 6 列和大约 1600 行)
@AmiTavory 让我打印x_train
(我会稍等片刻编辑帖子)
@gowrath 添加了print x_train
输出
@KostasRim 你能试试custom.dropna().hist()
吗?
【参考方案1】:
我遇到了同样的问题,我发现这是因为 NumPy 数组是对象数组而不是浮点数组。
试试这个:
x_train = x_train.astype(np.float)
【讨论】:
这只是一个练习。如果我记得我找到了解决方法。不过感谢您的回答!【参考方案2】:所以我很确定您的问题与数组 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))
您的问题出在这部分(参见代码中 cmets 中的解释):
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])
【讨论】:
哇非常感谢,确实添加逗号解决了问题以上是关于Pandas 数据框:ValueError:num 必须为 1 <= num <= 0,而不是 1的主要内容,如果未能解决你的问题,请参考以下文章
Pandas - 在数据框中附加字符串:ValueError:无法从重复的轴重新索引
将 JSON 读取到 pandas 数据框 - ValueError:将 dicts 与非系列混合可能会导致排序不明确
ValueError:在 Pandas 数据帧上使用 itertuples() 时解包的值太多