Python 负索引差异

A_A*_*old 5 python pandas

我正在使用 python 3.6、pandas 24.2 并遇到了差异。

>>> x = pd.Series(range(3))
>>> x[-1]

>>> x = pd.Series(range(3), index=[0,1,2])
>>> x[-1]
Run Code Online (Sandbox Code Playgroud)

两者都会产生错误

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/conda3/ml4t/lib/python3.6/site-packages/pandas/core/series.py", line 868, in __getitem__
    result = self.index.get_value(self, key)
  File "/opt/conda3/ml4t/lib/python3.6/site-packages/pandas/core/indexes/base.py", line 4375, in get_value
    tz=getattr(series.dtype, 'tz', None))
  File "pandas/_libs/index.pyx", line 81, in pandas._libs.index.IndexEngine.get_value
  File "pandas/_libs/index.pyx", line 89, in pandas._libs.index.IndexEngine.get_value
  File "pandas/_libs/index.pyx", line 132, in pandas._libs.index.IndexEngine.get_loc
  File "pandas/_libs/hashtable_class_helper.pxi", line 987, in pandas._libs.hashtable.Int64HashTable.get_item
  File "pandas/_libs/hashtable_class_helper.pxi", line 993, in pandas._libs.hashtable.Int64HashTable.get_item
KeyError: -1
Run Code Online (Sandbox Code Playgroud)

尽管

>>> x = pd.Series(range(3), index=['a','b','c'])
>>> x[-1]
2
Run Code Online (Sandbox Code Playgroud)

与任何其他形式的索引一起使用都可以。它们是相同的数据结构,但添加某些类型的索引允许负索引,而其他类型则不允许?

jos*_*ai2 1

要使用负索引,您可以使用:

\n\n
x.iloc[-1]\n
Run Code Online (Sandbox Code Playgroud)\n\n

这在所有情况下都有效。

\n\n

是的,该错误是由于 @a-arnold 提到的一致性问题造成的。

\n\n

由于索引[]必须处理很多情况,所以我们不能总是使用这样的索引。

\n\n

当您将自定义索引设置为字符串时,负索引会起作用,因为它与整数索引不冲突。

\n\n

索引和选择数据 \xe2\x80\x94 pandas 1.0.3 文档提供了有关 pandas 中索引和选择的很好的想法。

\n