如何从时间戳索引的DataFrame取值?为何出现KeyError报错
为什么用
d[d.index[0]]['a']会报KeyError? 咱们先拆解下你写的代码逻辑和问题出在哪:
首先看你构造的DataFrame:
import datetime import pandas as pd dates = [datetime.datetime.today() + datetime.timedelta(days=x) for x in range(0, 2)] d = pd.DataFrame([[1,2],[3,4]], index = dates, columns = ['a', 'b'])
这个DataFrame的结构是用日期做行索引,列名是'a'和'b'。
错误原因
你写的d[d.index[0]]这里犯了一个常见的索引误区:在Pandas的DataFrame中,直接用方括号[]默认是按列名来索引的,而你传入的d.index[0]是一个Timestamp类型的行索引值,你的DataFrame里根本没有叫这个Timestamp的列,所以自然会抛出KeyError。
正确的取值方式
给你几种靠谱的写法:
- 最推荐:用
.loc做标签索引.loc是Pandas专门用于按标签(行索引名、列名)取值的方法,语法清晰不容易出错:
d.loc[d.index[0], 'a']
这里第一个参数是行标签(你的日期索引),第二个参数是列名,直接就能拿到对应的值。
- 用
.iloc按位置索引
如果你只关心行的位置(比如第一行),可以用.iloc按整数位置来取:
d.iloc[0]['a']
.iloc[0]取到第一行的Series,再通过['a']拿到对应列的值。
- 布尔索引(稍繁琐,不推荐)
也可以通过布尔条件筛选出目标行,再取值:
d[d.index == d.index[0]]['a'].values[0]
不过这种写法需要额外提取values,不如前两种简洁直观。
总结一下:DataFrame的[]默认是列索引,要按行索引取值的话,一定要用.loc(标签)或者.iloc(位置)这类专门的索引方法哦~
内容的提问来源于stack exchange,提问作者Samuel
相关产品推荐
相关产品推荐

