熊猫DataFrame切片有一个KeyError:-1错误

时间:2019-01-21 00:47:30

标签: python pandas dataframe

我已将问题缩小为以下代码:

import pandas as pd
d = {'b' : 1, 'a' : 0, 'c' : 2}
c = {'one':[1,2,3], 'two':[4,5,6]}
p = pd.Series(d)
pc = pd.DataFrame(c)
print(p[-1]) # This line works
print(pc['two'][-1]) # This line does not work.
  

回溯(最近通话最近):     在第9行的文件“ jdoodle.py”中       打印(pc ['two'] [-1])     在 getitem 中的文件“ /usr/lib/python3.6/site-packages/pandas/core/series.py”,行766       结果= self.index.get_value(self,键)     get_value中的文件“ /usr/lib/python3.6/site-packages/pandas/core/indexes/base.py”,行3103       tz = getattr(series.dtype,'tz',无)     在pandas._libs.index.IndexEngine.get_value中的文件“ pandas / _libs / index.pyx”,第106行     在pandas._libs.index.IndexEngine.get_value中的文件“ pandas / _libs / index.pyx”,第114行     在pandas._libs.index.IndexEngine.get_loc中的文件“ pandas / _libs / index.pyx”,第162行     958行中的文件“ pandas / _libs / hashtable_class_helper.pxi”在pandas._libs.hashtable.Int64HashTable.get_item中     在pandas._libs.hashtable.Int64HashTable.get_item中的文件“ pandas / _libs / hashtable_class_helper.pxi”,行964   KeyError:-1   命令以非零状态1退出

type(p)pandas.core.series.Series

type(pc['two'])pandas.core.series.Series

我的问题是p[-1]有效,但pc['two'][-1]显示错误KeyError:-1 我真的很困惑为什么pc['two'][-1]显示错误。需要帮忙。谢谢

4 个答案:

答案 0 :(得分:0)

编辑:它比我之前写的还要酷!

我测试了您在做什么,您可以毫无问题地致电pc[1],但不能致电pc[-1]。这是因为Series仅模仿正整数的常规列表索引行为!

所以pc["two"]不是dict的样子,这只是Series对象模仿list索引的方式。即使我的答案是错误的,我也将过去的错误答案留给历史。


错误的旧答案

简短的答案是,当您尝试访问类似dict的对象时,就像它是类似list的对象一样,通常会收到该错误。 p[-1]正在按有序列表[0, 0, 1, 2, "dog"]

的顺序访问最后一个项目
print(p[-1]) # dog

pc["two"]不能通过这种方式访问​​(因为它看起来像纯Python dict,通过查看您的代码。)KeyError与您将得到的异常相同如果您运行以下代码:

p = {"dog": [0, 2]}
p[-1]

事实上,我认为除dog以外的任何键都会抛出KeyError异常。无法像访问列表(即整数索引)那样访问类似dict的对象

答案 1 :(得分:0)

我同意@CharlesLandau,但是您可以使用以下解决方案:

第一个,在索引之前将其放入列表中

print(pc['two'].tolist()[-1])

第二,使用iloc

print(pc['two'].iloc[-1])

答案 2 :(得分:0)

除了其他答案外,Pandas系列也是一成不变的。因此,这意味着索引值应该是可哈希的。它使用RangeIndex索引,因此,它仅接受正整数。请参阅此文档-https://pandas.pydata.org/pandas-docs/version/0.23.3/generated/pandas.Series.html

答案 3 :(得分:0)

具有pd.RangeIndex索引的系列不支持通过__getitem__的负索引。注意[]__getitem__的语法糖。您可以直接检查索引的性质:

pc.index  # RangeIndex(start=0, stop=3, step=1)
p.index   # Index(['a', 'b', 'c'], dtype='object')

因此,使用非基于范围的索引可以很好地工作:

pc.index = ['x', 'y', 'z']
print(pc['two'][-1])  # 6

但是,这是文档actively discourage的链接索引示例。使用iloc / iat代替基于整数的索引。例如:

print(pc['two'].iat[-1])  # 6

或通过单个索引操作:

print(pc.iat[-1, pc.columns.get_loc('two')])  # 6