TypeError:无法使用这些索引器对 <class 'pandas.indexes.base.Index'> 进行标签索引

Posted

技术标签:

【中文标题】TypeError:无法使用这些索引器对 <class \'pandas.indexes.base.Index\'> 进行标签索引【英文标题】:TypeError: cannot do label indexing on <class 'pandas.indexes.base.Index'> with these indexersTypeError:无法使用这些索引器对 <class 'pandas.indexes.base.Index'> 进行标签索引 【发布时间】:2018-01-09 03:54:57 【问题描述】:

重命名 pandas 数据框列后出现错误:

B=pd.DataFrame(data=[[1,1,1],[2,2,2]],columns='A','B','C')
print(B.loc[0,'B'])
B = B.rename(index=str,columns='B':'B_B')
print(B.loc[0,'B_B'])

此代码导致以下输出:

> 1

>Traceback (most recent call last):
  File "C:\Users\FreieL01\AppData\Local\Continuum\Anaconda3\lib\site-packages\IPython\core\interactiveshell.py", line 2881, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-29-6df9197203b9>", line 4, in <module>
    print(B.loc[0,'B_B'])
  File "C:\Users\FreieL01\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\core\indexing.py", line 1310, in __getitem__
    return self._getitem_tuple(key)
  File "C:\Users\FreieL01\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\core\indexing.py", line 796, in _getitem_tuple
    return self._getitem_lowerdim(tup)
  File "C:\Users\FreieL01\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\core\indexing.py", line 922, in _getitem_lowerdim
    section = self._getitem_axis(key, axis=i)
  File "C:\Users\FreieL01\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\core\indexing.py", line 1482, in _getitem_axis
    self._has_valid_type(key, axis)
  File "C:\Users\FreieL01\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\core\indexing.py", line 1409, in _has_valid_type
    key = self._convert_scalar_indexer(key, axis)
  File "C:\Users\FreieL01\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\core\indexing.py", line 196, in _convert_scalar_indexer
    return ax._convert_scalar_indexer(key, kind=self.name)
  File "C:\Users\FreieL01\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\indexes\base.py", line 1171, in _convert_scalar_indexer
    return self._invalid_indexer('label', key)
  File "C:\Users\FreieL01\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\indexes\base.py", line 1284, in _invalid_indexer
    kind=type(key)))
TypeError: cannot do label indexing on <class 'pandas.indexes.base.Index'> with these indexers [0] of <class 'int'>

似乎重命名改变了我的datafframe对象的类型......

【问题讨论】:

【参考方案1】:

运行df.rename(index=str, ...) 会使您的数据帧索引类型转换为字符串类型,因此它们将是字符串。您可以通过打印出来确认这一点。

In [19]: B.index
Out[19]: Index(['0', '1'], dtype='object')

因此,这是可行的:

In [18]: print(B.loc['0', 'B_B'])
1

如果您不想这样,在重命名 B 列时不要传递 index 属性,如下所示:

B = B.rename(columns='B':'B_B')

【讨论】:

正确。 @LazlooXp,你的预期结果是什么? @Alexander 打赌是 OP 在 google 上找到了这段代码并在没有完全理解其含义的情况下运行它...... 我错过了解释参数索引。我认为它定义了列名称的原始类型。

以上是关于TypeError:无法使用这些索引器对 <class 'pandas.indexes.base.Index'> 进行标签索引的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Handsontable 中使用自定义渲染器对列进行排序?

Python:无法替换列表中的项目,原因是:TypeError:列表索引必须是整数或切片,而不是 str

为啥这些 Jest 测试失败了? TypeError:无法读取未定义的属性“应用”

TypeError:只有一个元素的整数数组可以转换为索引

Python:TypeError:字符串索引必须是整数[关闭]

TypeError:列表索引必须是整数或切片,而不是列表