子集化的熊猫数据帧

时间:2018-01-04 05:05:36

标签: python pandas subset

我发现以下两种方法存在不一致(至少对我而言):

对于定义为:

的数据框
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来避免这些问题。

2 个答案:

答案 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.loclabel选择数据(字符串或整数或任何其他格式,在本例中为int),df.ilocposition选择数据。在您的示例中,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]时才会起作用。否则,它将失败或给你一个错误的结果。因此,对于位置索引,您必须坚持使用ilocloc进行名称索引。