我正在生成一个空的数据帧,以一系列日期作为索引。数据将在稍后添加到数据帧中。在
cbd=pd.date_range(start=pd.datetime(2017,01,02),end=pd.datetime(2017,01,30),period=1)
df = pd.DataFrame(data=None,columns=['Test1','Test2'],index=cbd)
df.head()
Test1 Test2
2017-01-02 NaN NaN
2017-01-03 NaN NaN
2017-01-04 NaN NaN
2017-01-05 NaN NaN
2017-01-06 NaN NaN
一些切片方法似乎不起作用。以下命令将返回一个KeyError:
^{pr2}$但是,以下任何工作:
df['2017-01-02':'2017-01-02']
df.loc['2017-01-02']
我错过了什么?为什么第一个切片不返回结果?在
首先,我更新了你的测试数据(仅供参考),因为它返回一个“无效令牌”错误。请查看此处的更改:
现在看第一行:
^{pr2}$然后尝试初始切片方法会产生以下错误:
现在使用
column
名称尝试此操作:我们尝试“测试1”:
并从该列获取
NaN
输出。在因此,您所使用的格式被设计用于
column
名称,除非您使用此格式df['2017-01-02':'2017-01-02']
。在Pandas docs状态“下面的选择将引发一个KeyError;否则,此选择方法将与pandas中的其他选择方法不一致(因为这不是一个切片,也不能解析为一个切片)”。在
因此,在您正确识别的情况下,DataFrame.loc是一个基于标签的索引器,它生成您要查找的输出:
df[]
[]
内使用:
,则其内的值将被视为列。在[]
内使用:
,那么它里面的值将被视为行。在为什么是双重性?
因为大多数时候人们希望对行进行切片,而不是对列进行切片。所以他们决定}应该对应于列。在
x
,df[x:y]
中的y
应该对应于行,d[x]
或x
,df[[x,y]]
中的{示例:
输出:
^{pr2}$现在,当你做
df['B']
时,它可能意味着两件事:获取第二个索引
^{3美元B
,并给您第二行1 2 3
取第二列
B
,然后给你第二列2 2 2
。所以为了解决这个冲突并保持它的明确性,
df['B']
总是意味着你想要列'B'
,如果没有这样的列,它将抛出一个错误。在为什么
df['2017-01-02']
失败?它将搜索列
'2017-01-02'
,因为没有这样的列,它抛出一个错误。在那么
df.loc['2017-01-02']
为什么起作用呢?因为
.loc[]
的语法是df.loc[row,column]
,如果愿意,可以省略该列,就像在您的例子中一样,它的意思是df.loc[row]
有区别,因为使用不同的方法:
对于select,需要一行
loc
:Docs - partial string indexing:
^{pr2}$这是纯粹的partial string indexing:
相关问题 更多 >
编程相关推荐