我发现以下两种方法存在不一致(至少对我而言):
对于定义为:
的数据框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来避免这些问题。
答案 0 :(得分:2)
不幸的是,您没有正确使用它们。你获得相同的结果只是巧合。
df.loc[i, j]
表示df中的元素,其中包含名为i
的行和名为j
的列
除了许多其他偏差之外,df[j]
表示名为j
的列,df[j][i]
表示名为j
的列,而名为i
的列表示{ {1}}。
df.iloc[i, j]
表示i
- 行中的元素,j
- 列从0开始。
因此,df.loc
按label
选择数据(字符串或整数或任何其他格式,在本例中为int),df.iloc
按position
选择数据。在您的示例中,i
行名为i
,这只是巧合。
有关详细信息,请阅读doc
<强>更新强>:
将df[4][1]
视为一种便捷的方式。有一些逻辑背景,在大多数情况下,你会得到你想要的。
实际上
df.index = ['7', '88']
df[4][1]
有效,因为索引的dtype是str。你给一个int 1
,所以它会回落到位置索引。如果您运行:
df.index = [7, 88]
df[4][1]
会引发错误。和
df.index = [1, 0]
df[4][1]
Sill不是你期望的元素。因为它不是第一行从0开始。它将是名为1
答案 1 :(得分:2)
您应该将DataFrame视为列的集合。因此,当您执行df[4]
时,您将获得df
的第4列,这是Pandas系列类型。执行df[4][1]
后,您将获得此系列的第1个元素,该元素对应于DataFrame的第1行和第4列条目,这正是df.iloc[1,4]
的确切作用。
因此,完全没有矛盾,但要注意:只有当您没有任何列名或列名为[0,1,2,3,4]时才会起作用。否则,它将失败或给你一个错误的结果。因此,对于位置索引,您必须坚持使用iloc
或loc
进行名称索引。