【问题标题】:ValueError: Wrong number of items passed - Meaning and suggestions?ValueError:传递的项目数量错误 - 含义和建议?
【发布时间】:2017-08-29 01:03:54
【问题描述】:

我收到错误: 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')

【问题讨论】:

  • 我不知道 Pandas(顺便说一句,你应该添加那个标签),但是那个回溯报告在 results['predictedY'] = ... 行上报告了一个 KeyError,这意味着 results 没有'predictedY' 键。 results 是否是某个允许 [] 访问但不允许您创建新密钥的 Pandas 对象?
  • 结果不应该是 testX.copy()。你能说一下 testSet、testX 和 testY 有什么关系吗?
  • 这个问题不是这样,但这是谷歌搜索错误导致我的地方,所以我会在这里添加它。我最终得到了两个同名的列,并得到了错误ValueError: Wrong number of items passed 2, placement implies 1。删除意外重复的列解决了问题。
  • 另一个想法:这篇文章stackoverflow.com/questions/37092187/… 说您可以将 DF 列类型更改为“对象”以将元组存储在单个 DF 单元格中。

标签: python pandas prediction data-science


【解决方案1】:

所以 ValueError: The wrong number of items passed 3, placement 意味着 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)

【讨论】:

  • 请解释链接网站如何适用于原始问题。
  • 请您详细说明一下吗?
  • @AshishAgarwal 方法所需的参数,我们必须从调用部分传递相同数量的参数。
【解决方案2】:

我在尝试将单列数据框 df 转换为系列 pd.Series(df) 时遇到此错误。 我解决了这个问题

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

问题在于数据框中的值是列表:

  my_col
0 ['a']
1 ['b']
2 ['c']
3 ['d']

当我打印数据框时,它没有显示括号,因此很难追踪。

【讨论】:

    【解决方案3】:

    从 pandas 1.3.x 开始,不允许将对象(例如,来自嵌入的 eagertensor)填充到列中。

    https://github.com/pandas-dev/pandas/blame/master/pandas/core/internals/blocks.py

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
    • 链接现在失效了。会对 pandas 1.3 和旧版本之间的区别非常感兴趣。
    【解决方案4】:

    只需添加此作为答案:嵌套方法和放错右括号也会引发此错误,例如:

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

    这对你们大多数人来说可能是常识,但在我意识到自己的错误之前我很困惑。

    【讨论】:

      【解决方案5】:

      此错误的另一个原因是当您在有两列同名的 DataFrame 上应用函数时。

      【讨论】:

      • 您尝试设置或用作给定函数的输入参数的两列?
      • @TomS,不,当 DataFrame 中有两列同名时。
      • 谢谢,其实已经找到问题了,就是这样。
      • 我在尝试使用最大值或平均值进行分组和聚合时遇到此错误。伯爵出于某种原因工作。在我检查了重复的列之后,一切都再次正常。
      【解决方案6】:
      for i in range(100):
      try:
        #Your code here
        break
      except:
        continue
      

      这个对我有用。

      【讨论】:

      • 使用 try/except 是非常糟糕的做法,除非你不知道为什么某些东西不起作用。
      【解决方案7】:

      不确定这是否与您的问题有关,但将来可能与其他人有关:我遇到了类似的错误。原来 df 是空的(有零行),这就是导致我的命令出错的原因。

      【讨论】:

      • 跟我差不多,所以我放if len(df)&gt;0:,以防出错
      • 这也是我的答案。我已经完成了df_splits = np.array_split(input_df, nb_splits),而nb_splits 结果对于我的input_df 的大小来说太高了,这导致一些拆分为空数据框。
      • 跟我一样!如果您选择了数据框的“某些行”并对其进行数据操作,则可能会发生此错误。当所选DataFrame的形状为(0,x)时,会发生此错误? span>
      【解决方案8】:

      一般来说,错误ValueError: Wrong number of items passed 3, placement implies 1 表明您试图将太多鸽子放在太少的鸽笼中。在这种情况下,等式右边的值

      results['predictedY'] = predictedY

      试图将 3 个“东西”放入一个只允许一个的容器中。因为左侧是数据框列,并且可以在该(列)维度上接受多个项目,所以您应该看到另一个维度上的项目太多。

      在这里,您似乎正在使用 sklearn 进行建模,这就是 gaussian_process.GaussianProcess() 的来源(我猜,但如果这是错误的,请纠正我并修改问题)。

      现在,您在此处生成 y 的预测值:

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

      但是,正如我们从the documentation for GaussianProcess 看到的,predict() 返回两个项目。第一个是y,它是类似数组的(强调我的)。这意味着它可以有多个维度,或者,对于像我这样头脑清醒的人来说,它可以有多个列——看到它可以返回(n_samples, n_targets),这取决于testX,可能是(1000, 3)(只是为了选择数字)。因此,您的 predictedY 可能有 3 列。

      如果是这样,当您尝试将包含三个“列”的内容放入单个数据框列中时,您将传递 3 个仅适合 1 个的项目。

      【讨论】:

      • 从这个 sklearn 模块中概括出来,一个好的故障排除策略似乎是:使用 shape() 方法检查两边并推断你的右侧获胜的原因不适合你的左侧。然后,您将获得重要信息来帮助解决其中一个形状异常的原因。
      • 是的,谢谢@Philip。使用形状方法有帮助。对我来说,有问题的项目是一个空数据框。
      猜你喜欢
      • 1970-01-01
      • 2016-04-09
      • 2021-07-13
      • 2021-04-08
      • 2021-07-05
      • 2020-01-30
      • 2021-08-10
      • 2020-07-02
      • 2019-08-09
      相关资源
      最近更新 更多