【发布时间】:2018-01-04 05:05:35
【问题描述】:
我发现以下两种方法不一致(至少对我而言):
对于定义为的数据框:
df=pd.DataFrame([[1,2,3,4,np.NaN],[8,2,0,4,5]])
我想访问第 1 行第 4 列中的元素(从 0 开始计数)。我要么这样做:
df[4][1]
Out[94]: 5.0
或者这个:
df.iloc[1,4]
Out[95]: 5.
我是否正确理解在第一种方法中我需要先使用列然后使用行,反之亦然在使用 iloc 时?我只是想确保我正确使用这两种方法。
编辑:下面的一些答案指出第一种方法并不可靠,我现在明白这就是原因:
df.index = ['7','88']
df[4][1]
Out[101]: 5.0
我仍然得到正确的结果。但是使用 int 代替,如果相应的数字不再存在,则会引发异常:
df.index = [7,88]
df[4][1]
KeyError: 1
另外,更改列名:
df.columns = ['4','5','6','1','5']
df['4'][1]
Out[108]: 8
给我一个不同的结果。所以总的来说,我应该坚持 iloc 或 loc 以避免这些问题。
【问题讨论】:
-
是的,但是对于第一种情况,您不能总是保证它会起作用。但是,使用位置索引,索引的解释是一致的。我会坚持使用
loc或iloc或at或iat几乎 除非没有歧义的可能性。 -
你的意思是,如果我更改行和列的名称,第一种方法将不起作用,对吧?
-
是的,只有当您没有任何列名或列名是 [0,1,2,3,4] 时,它才会起作用。否则,它要么失败,要么给你一个错误的结果。
-
这是有道理的。非常感谢您的帮助。
-
你还应该测试
df.index = [0, 2]; df[4][1]