提问人:Liqs 提问时间:10/27/2023 最后编辑:Liqs 更新时间:10/27/2023 访问量:33
为什么直接使用 [-1] 索引 pandas 系列会产生 KeyError,而使用 iloc[-1] 却不会?
Why does indexing a pandas series directly with [-1] yield a KeyError, but using iloc[-1] does not?
问:
问题描述
我正在尝试提取 pandas 系列的第一个和最后一个元素,以了解有关数据完整性的断言。但是,当我不直接用于访问对象中的元素时,我会得到一个“KeyError: -1”。iloc
pd.Series
代码片段
for year in df['year'].unique():
yearly_slice = df[df['year'] == year]
if len(yearly_slice) > 1:
fst = yearly_slice[foo].iloc[-1] # Yields the expected result
fst = yearly_slice[foo][-1] # Raises KeyError: -1
# Rest of code ...
更多背景
根据我的理解,结果应该没有区别,特别是因为我没有迭代yearly_slice,只是试图读取数据(我知道写作是有区别的)。
我已经检查了 pandas 文档,但它没有提供有关 pandas 在使用负偏移量时的行为的任何信息。[]
答:
2赞
mozway
10/27/2023
#1
出现错误是因为索引中不是键。-1
如果您有一个非范围索引(然后 pandas 推断您正在使用位置索引器),则使用可能会起作用,但这不是一个好的做法。[-1]
例如,请参阅:
pd.Series([0,1,2], index=list('abc'))[-1]
# 2
pd.Series([0,1,2])[-1]
# KeyError: -1
总之,始终使用 iloc
进行位置索引,这是唯一安全的方法。
或者,使用底层 numpy 数组:
pd.Series([0,1,2]).values[-1]
pd.Series([0,1,2]).to_numpy()[-1]
评论
yearly_slice[foo][-1]
应该可以,你用的是哪个 pandas 版本?df.groupby('year')[foo].agg(['min', 'max'])
df.groupby('year')[foo].agg(['min', 'max', 'size'])
for yearly_slice in df['year'].unique():
type(yearly_slice)
df.head().to_dict('tight')
loc
iloc
[]
__getitem__