Python 在df列/时间序列中按索引-1选择会引发错误
假设我们有一个简单的数据帧,如下所示:Python 在df列/时间序列中按索引-1选择会引发错误,python,pandas,dataframe,indexing,numpy-slicing,Python,Pandas,Dataframe,Indexing,Numpy Slicing,假设我们有一个简单的数据帧,如下所示: df = pd.DataFrame({'col1':[1,2,3], 'col2':[10,20,30]}) 然后我可以选择这样的元素 df.col2[0]或df.col2[1] 但是如果我想用df.col2[-1]选择最后一个元素,它会导致错误消息: KeyError: -1 我知道有解决办法。例如,我可以执行df.col2[len(df)-1]或df.iloc[-1,1]。但是为什么不允许通过-1直接编制简单得多的索引呢?我是否错过了-1的另一种简
df = pd.DataFrame({'col1':[1,2,3], 'col2':[10,20,30]})
然后我可以选择这样的元素
df.col2[0]
或df.col2[1]
但是如果我想用df.col2[-1]
选择最后一个元素,它会导致错误消息:
KeyError: -1
我知道有解决办法。例如,我可以执行
df.col2[len(df)-1]
或df.iloc[-1,1]
。但是为什么不允许通过-1
直接编制简单得多的索引呢?我是否错过了-1
的另一种简单选择方式?Tnx数据帧的索引标签是[0,1,2]。您的代码df.col2[1]
相当于使用loc函数作为df['col2'].loc[1]
(或df.col2.loc[1]
)。您可以看到索引中不包含标签'-1'(这就是为什么会出现KeyError)
对于位置索引,您需要使用iloc函数(可以在Pandas系列和DataFrame上使用),因此可以执行df['col2'].iloc[-1]
(或df.col2.iloc[-1]
)
如您所见,您可以同时使用基于标签的('col2')和基于位置的(-1)索引,您不需要选择一个或另一个作为
df.iloc[-1,1]
或df.col2[len(df)-1]
(这相当于df.loc[lend(df)-1,'col2']
)数据帧的索引标签是[0,1,2]。您的代码df.col2[1]
相当于使用loc函数作为df['col2'].loc[1]
(或df.col2.loc[1]
)。您可以看到索引中不包含标签'-1'(这就是为什么会出现KeyError)
对于位置索引,您需要使用iloc函数(可以在Pandas系列和DataFrame上使用),因此可以执行df['col2'].iloc[-1]
(或df.col2.iloc[-1]
)
正如您所看到的,您可以同时使用基于标签的('col2')和基于位置的(-1)索引,您不需要选择一个或另一个作为
df.iloc[-1,1]
或df.col2[len(df)-1]
(这相当于df.loc[lend(df)-1,'col2']
)当使用Python列表时,myu列表[-1]
访问最后一项。然而,df.col2
不是Python列表,而是熊猫系列。如果您想访问最后一个项目,可以先将其转换为列表,然后通过[-1]或其他方式访问它,如回复@R.dV谢谢,这会有一点帮助!但是你知道让df.col2[1]
成为可能,而不是df.col2[-1]
的动机是什么吗。一些编程范例?或者关于python的工作方式?还有更深层次的含义吗?列表是Python固有的,Pandas和它的所有特性都不是。我想熊猫背后的开发者们是有原因的,但我只能猜测这是什么。但据我所知,熊猫系列不是一个列表,而是一本字典,所以它使用键。列表[1]访问索引1处的项,而序列[1]访问键1处的项,这是一个细微的区别。dm2的回答对此进行了更详细的解释。当使用Python列表时,my_list[-1]
访问最后一项。然而,df.col2
不是Python列表,而是熊猫系列。如果您想访问最后一个项目,可以先将其转换为列表,然后通过[-1]或其他方式访问它,如回复@R.dV谢谢,这会有一点帮助!但是你知道让df.col2[1]
成为可能,而不是df.col2[-1]
的动机是什么吗。一些编程范例?或者关于python的工作方式?还有更深层次的含义吗?列表是Python固有的,Pandas和它的所有特性都不是。我想熊猫背后的开发者们是有原因的,但我只能猜测这是什么。但据我所知,熊猫系列不是一个列表,而是一本字典,所以它使用键。列表[1]访问索引1处的项,而序列[1]访问键1处的项,这是一个细微的区别。dm2的回答更详细地解释了这一点。谢谢,很高兴知道所有的替代方案和切片!但是你知道让df.col2[1]
成为可能,而不是df.col2[-1]
的动机是什么吗。一些编程范例?或者关于python的工作方式?还有更深层次的含义吗?好吧,这只是因为熊猫的df[col][index]
等同于标签索引(即df.loc[index\u label,column\u label]
,并且您不能使用不存在的标签(因此,如果您的数据帧有一个标记为-1的行,您可以使用df.col2[-1]来获取该行),对于位置索引,您需要指定使用.iloc
。我想熊猫优先使用基于标签的索引,而不是位置索引。由于列表和numpy数组的行和列都没有附加标签,因此位置索引是它们的默认值。(新注释更正.loc到.iloc)谢谢,知道所有的替代方案和切片很好!但是你知道让df.col2[1]
成为可能的动机是什么吗,而不是df.col2[-1]
。一些编程范例?或者一些关于python应该工作的方式的东西?有什么更深层的意义吗?好吧,这就是熊猫df[col][index]
相当于标签索引(即,df.loc[index\u label,column\u label]
并且您不能使用不存在的标签(因此,如果您的数据帧有一个标记为-1的行,您可以使用df.col2[-1]来获取该行),对于位置索引,您需要指定使用.iloc
。我想熊猫优先使用基于标签的索引,而不是位置索引。由于列表和numpy数组的行和列都没有附加标签,因此位置索引是它们的默认值。(新注释更正.loc到.iloc)