数值错误:传递的项目数量不正确 - 意义和建议?

82
我收到了错误信息:ValueError: Wrong number of items passed 3, placement implies 1,但我很难确定问题出在哪里以及如何解决它。
我不太理解这个错误的含义,这使得我很难进行故障排除。我还在我的Jupyter Notebook中包含了触发错误的代码块。
数据很难附加,因此我不希望任何人为了帮我重新创建此错误。我只是想听取一些关于如何解决此错误的反馈意见。
KeyError                                  Traceback (most recent call last)
C:\Users\brennn1\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\indexes\base.py in get_loc(self, key, method, tolerance)
   1944             try:
-> 1945                 return self._engine.get_loc(key)
   1946             except KeyError:

pandas\index.pyx in pandas.index.IndexEngine.get_loc (pandas\index.c:4154)()

pandas\index.pyx in pandas.index.IndexEngine.get_loc (pandas\index.c:4018)()

pandas\hashtable.pyx in pandas.hashtable.PyObjectHashTable.get_item (pandas\hashtable.c:12368)()

pandas\hashtable.pyx in pandas.hashtable.PyObjectHashTable.get_item (pandas\hashtable.c:12322)()

KeyError: 'predictedY'

During handling of the above exception, another exception occurred:

KeyError                                  Traceback (most recent call last)
C:\Users\brennn1\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\core\internals.py in set(self, item, value, check)
   3414         try:
-> 3415             loc = self.items.get_loc(item)
   3416         except KeyError:

C:\Users\brennn1\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\indexes\base.py in get_loc(self, key, method, tolerance)
   1946             except KeyError:
-> 1947                 return self._engine.get_loc(self._maybe_cast_indexer(key))
   1948 

pandas\index.pyx in pandas.index.IndexEngine.get_loc (pandas\index.c:4154)()

pandas\index.pyx in pandas.index.IndexEngine.get_loc (pandas\index.c:4018)()

pandas\hashtable.pyx in pandas.hashtable.PyObjectHashTable.get_item (pandas\hashtable.c:12368)()

pandas\hashtable.pyx in pandas.hashtable.PyObjectHashTable.get_item (pandas\hashtable.c:12322)()

KeyError: 'predictedY'

During handling of the above exception, another exception occurred:

ValueError                                Traceback (most recent call last)
<ipython-input-95-476dc59cd7fa> in <module>()
     26     return gp, results
     27 
---> 28 gp_dailyElectricity, results_dailyElectricity = predictAll(3, 0.04, trainX_dailyElectricity, trainY_dailyElectricity, testX_dailyElectricity, testY_dailyElectricity, testSet_dailyElectricity, 'Daily Electricity')

<ipython-input-95-476dc59cd7fa> in predictAll(theta, nugget, trainX, trainY, testX, testY, testSet, title)
      8 
      9     results = testSet.copy()
---> 10     results['predictedY'] = predictedY
     11     results['sigma'] = sigma
     12 

C:\Users\brennn1\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\core\frame.py in __setitem__(self, key, value)
   2355         else:
   2356             # set column
-> 2357             self._set_item(key, value)
   2358 
   2359     def _setitem_slice(self, key, value):

C:\Users\brennn1\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\core\frame.py in _set_item(self, key, value)
   2422         self._ensure_valid_index(value)
   2423         value = self._sanitize_column(key, value)
-> 2424         NDFrame._set_item(self, key, value)
   2425 
   2426         # check if we are modifying a copy

C:\Users\brennn1\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\core\generic.py in _set_item(self, key, value)
   1462 
   1463     def _set_item(self, key, value):
-> 1464         self._data.set(key, value)
   1465         self._clear_item_cache()
   1466 

C:\Users\brennn1\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\core\internals.py in set(self, item, value, check)
   3416         except KeyError:
   3417             # This item wasn't present, just insert at end
-> 3418             self.insert(len(self.items), item, value)
   3419             return
   3420 

C:\Users\brennn1\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\core\internals.py in insert(self, loc, item, value, allow_duplicates)
   3517 
   3518         block = make_block(values=value, ndim=self.ndim,
-> 3519                            placement=slice(loc, loc + 1))
   3520 
   3521         for blkno, count in _fast_count_smallints(self._blknos[loc:]):

C:\Users\brennn1\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\core\internals.py in make_block(values, placement, klass, ndim, dtype, fastpath)
   2516                      placement=placement, dtype=dtype)
   2517 
-> 2518     return klass(values, ndim=ndim, fastpath=fastpath, placement=placement)
   2519 
   2520 # TODO: flexible with index=None and/or items=None

C:\Users\brennn1\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\core\internals.py in __init__(self, values, placement, ndim, fastpath)
     88             raise ValueError('Wrong number of items passed %d, placement '
     89                              'implies %d' % (len(self.values),
---> 90                                              len(self.mgr_locs)))
     91 
     92     @property

ValueError: Wrong number of items passed 3, placement implies 1

我的代码如下:

def predictAll(theta, nugget, trainX, trainY, testX, testY, testSet, title):

    gp = gaussian_process.GaussianProcess(theta0=theta, nugget =nugget)
    gp.fit(trainX, trainY)

    predictedY, MSE = gp.predict(testX, eval_MSE = True)
    sigma = np.sqrt(MSE)

    results = testSet.copy()
    results['predictedY'] = predictedY
    results['sigma'] = sigma

    print ("Train score R2:", gp.score(trainX, trainY))
    print ("Test score R2:", sklearn.metrics.r2_score(testY, predictedY))

    plt.figure(figsize = (9,8))
    plt.scatter(testY, predictedY)
    plt.plot([min(testY), max(testY)], [min(testY), max(testY)], 'r')
    plt.xlim([min(testY), max(testY)])
    plt.ylim([min(testY), max(testY)])
    plt.title('Predicted vs. observed: ' + title)
    plt.xlabel('Observed')
    plt.ylabel('Predicted')
    plt.show()

    return gp, results

gp_dailyElectricity, results_dailyElectricity = predictAll(3, 0.04, trainX_dailyElectricity, trainY_dailyElectricity, testX_dailyElectricity, testY_dailyElectricity, testSet_dailyElectricity, 'Daily Electricity')

1
我不知道Pandas(顺便说一下,你应该加上那个标签),但是这个回溯报告results['predictedY'] = ...行出现了KeyError错误,这意味着results没有'predictedY'键。results是一些允许[]访问的Pandas对象,但不允许创建新键吗? - Kevin J. Chase
测试结果不应该是testX.copy()吗?你能说一下testSet、testX和testY之间的关系吗? - Quickbeam2k1
这并不是这个问题的情况,但这就是我通过谷歌搜索错误得到的结果,所以我会在这里添加它。我最终出现了两列具有相同名称的情况,并且出现了错误 ValueError: Wrong number of items passed 2, placement implies 1。删除意外重复的列解决了这个问题。 - Jamie Bull
另一个想法:这篇帖子 https://dev59.com/d5bfa4cB1Zd3GeqPzdZF 提到,您可以将DF列类型更改为“object”,以将元组存储在单个DF单元格中。 - travelingbones
8个回答

87
一般而言,错误 ValueError: Wrong number of items passed 3, placement implies 1 意味着你试图将过多的“信鸽”放入太少的“鸽笼”中。在本例中,等式右侧的值 results['predictedY'] = predictedY 尝试将3个“东西”放入只允许一个的容器中。因为左边是数据框列,并且可以接受该(列)维度上的多个项目,因此您应该看到另一维度上有太多的项目。
这里,似乎您正在使用sklearn进行建模,gaussian_process.GaussianProcess() 就是从那里来的(我猜的,但如果我错了,请纠正问题)。现在,在这里生成预测值 ypredictedY, MSE = gp.predict(testX, eval_MSE = True) 然而,从 GaussianProcess 的文档 中可以看到,predict()返回两个项目。第一个是 y,它是“类似数组”的(强调是我的)。这意味着它可以具有多个维度或者说可以拥有多个列;可以看到它返回的是 (n_samples, n_targets),这取决于testX,它可以是(1000,3)(只是举个例子)。因此,您的predictedY可能有3列。
如果是这样,当你试图将具有三列的东西放入单个数据框列中时,你传递了3个项目,而只有1个会适合。

4
不针对这个sklearn模块,总体而言,一个好的故障排除策略是:使用shape()方法检查两侧并推断为什么右侧无法适应左侧,然后您将获得重要信息来帮助排除其中一侧形状不符预期的原因。 - Philip
1
是的,谢谢@Philip。使用shape方法很有帮助。对我来说,问题出在一个空数据框上。 - le_llama

53

不确定这是否与您的问题相关,但它可能与未来的某个人有关:我遇到了类似的错误。原来df是空的(没有任何行),这就是导致我的命令出错的原因。


4
跟我类似,因此我加了 if len(df)>0: 来避免错误。 - Wahyu Bram
1
这对我也是答案。我已经执行了 df_splits = np.array_split(input_df, nb_splits),而 nb_splits 对于我的 input_df 大小来说太高了,导致一些拆分为空的数据框。 - Bikash Gyawali
和我遇到的一样!如果你选择了数据框中的“某些行”并对其进行数据操作,则可能会出现此错误。当所选数据框的形状为(0,x)时,就会出现此错误。 - Bright Chang
操作者也可以在 results['predictedY'] = predictedY 之前尝试 results['predictedY'] = 0.0。在某些情况下,这对我有用,可以防止出现错误,但是是的,当我收到此消息时数据集为空。 - Flavio Rangel

3

出现这个错误的另一个原因是当您在DataFrame上应用函数时,存在两个具有相同名称的列。


你正在尝试设置或用作给定函数的输入参数的两列是哪两列? - Tom S
@TomS,不,当您在DataFrame中有两列具有相同名称时。 - Minions
1
谢谢,实际上我已经找到了问题,而且就是那个问题。 - Tom S
当我尝试使用max或mean进行分组和聚合时,遇到了这个错误。出于某种原因,计数起作用了。在检查了重复的列之后,一切都恢复正常了。 - user3411517

2

2
虽然这个链接可能回答了问题,但最好在此处包含答案的必要部分并提供参考链接。仅有链接的答案如果链接页面更改可能会变得无效。 - Trenton McKinney
链接已经失效了。非常想知道pandas 1.3和旧版本之间的区别。 - buhtz

2

ValueError: 当你传递了太多的参数但方法只支持少量参数时,会出现“传递的项目数量错误3,放置意味着1”的错误。例如 -

df['First_Name', 'Last_Name'] = df['Full_col'].str.split(' ', expand = True)

在上面的代码中,我试图将Full_col拆分为两个子列名-First_Name和Last_Name,所以在这里我会得到错误,因为我只传递了一个单独的参数而不是列的列表。
因此,为了避免这种情况,请使用另一个子列表。
df[['First_Name', 'Last_Name']] = df['Full_col'].str.split(' ', expand = True)

1
请提供一个解释,说明链接网站如何与原始问题相关。 - DaveL17
请您详细说明一下吗? - Ashish Agarwal
1
@AshishAgarwal 在调用方法时我们必须传递与所需参数数量相同的参数。 - mukesh yadav

0

我试图将一个单列数据框 df 转换为 Series,pd.Series(df) 时出现了这个错误。 我用下面的方法解决了它。

pd.Series(df.values.flatten())

问题在于数据框中的值是列表:
  my_col
0 ['a']
1 ['b']
2 ['c']
3 ['d']

当我打印数据框时,它没有显示括号,这使得跟踪变得困难。

0

仅作为答案添加此内容:嵌套方法和放置关闭括号错误也会引发此错误,例如:

march15_totals= march15_t.assign(sum_march15_t=march15_t[{"2021-03-15","2021-03-16","2021-03-17","2021-03-18","2021-03-19","2021-03-20","2021-03-21"}]).sum(axis=1)

与(正确的)版本相比: march15_totals= march15_t.assign(sum_march15_t=march15_t[{"2021-03-15","2021-03-16","2021-03-17","2021-03-18","2021-03-19","2021-03-20","2021-03-21"}].sum(axis=1))

这对大多数人来说可能是常识,但我一直感到困惑,直到我意识到我的错误。


-8
for i in range(100):
try:
  #Your code here
  break
except:
  continue

这个对我有用。


4
如果你不知道某个东西为什么不能正常工作,使用try/except是非常不好的做法。 - Matt Elgazar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接