我已将问题缩小为以下代码:
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]
显示错误。需要帮忙。谢谢
答案 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