为什么直接使用 [-1] 索引 pandas 系列会产生 KeyError,而使用 iloc[-1] 却不会?

Why does indexing a pandas series directly with [-1] yield a KeyError, but using iloc[-1] does not?

提问人:Liqs 提问时间:10/27/2023 最后编辑:Liqs 更新时间:10/27/2023 访问量:33

问:

问题描述

我正在尝试提取 pandas 系列的第一个和最后一个元素,以了解有关数据完整性的断言。但是,当我不直接用于访问对象中的元素时,我会得到一个“KeyError: -1”。ilocpd.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 在使用负偏移量时的行为的任何信息。[]

蟒蛇 熊猫 系列

评论

0赞 mozway 10/27/2023
yearly_slice[foo][-1]应该可以,你用的是哪个 pandas 版本?
0赞 mozway 10/27/2023
此外,给定您可能正在寻找的代码(或者如果您还想检查组的大小)df.groupby('year')[foo].agg(['min', 'max'])df.groupby('year')[foo].agg(['min', 'max', 'size'])
0赞 mozway 10/27/2023
实际上,从数组中生成项目,那么输入的 DataFrame 到底是什么?什么是 和 ?for yearly_slice in df['year'].unique():type(yearly_slice)df.head().to_dict('tight')
0赞 Liqs 10/27/2023
感谢您的评论。是的,我知道 groupby 和聚合,并在提供的片段之外使用它。然而,这不是我的问题。你是对的,我忘记了代码片段中关于输入 df 的相关部分。
0赞 Liqs 10/27/2023
此外,您在关闭问题时链接的帖子涉及 和 之间的区别,这与 和 的别名明显不同,您可以通过查阅我提供的 pandas 文档链接看到。lociloc[]__getitem__

答:

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]