【问题标题】:subsetting pandas dataframe对熊猫数据框进行子集化
【发布时间】: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 以避免这些问题。

【问题讨论】:

  • 是的,但是对于第一种情况,您不能总是保证它会起作用。但是,使用位置索引,索引的解释是一致的。我会坚持使用locilocatiat 几乎 除非没有歧义的可能性。
  • 你的意思是,如果我更改行和列的名称,第一种方法将不起作用,对吧?
  • 是的,只有当您没有任何列名或列名是 [0,1,2,3,4] 时,它才会起作用。否则,它要么失败,要么给你一个错误的结果。
  • 这是有道理的。非常感谢您的帮助。
  • 你还应该测试df.index = [0, 2]; df[4][1]

标签: python pandas subset


【解决方案1】:

您应该将 DataFrames 视为列的集合。因此,当您执行df[4] 时,您会得到df 的第 4 列,它是 Pandas 系列的类型。在此之后,当您执行df[4][1] 时,您将获得此系列的第一个元素,它对应于 DataFrame 的第 1 行和第 4 列条目,这正是 df.iloc[1,4] 所做的。

因此,根本没有不一致,但请注意:这仅在您没有任何列名或列名是 [0,1,2,3,4] 时才有效。否则,它要么失败,要么给你一个错误的结果。因此,对于位置索引,您必须坚持使用 ilocloc 进行名称索引。

【讨论】:

  • 我明白了,有道理。
【解决方案2】:

很遗憾,您没有正确使用它们。你得到相同的结果只是巧合。

df.loc[i, j] 表示 df 中的元素,其行名为 i,列名为 j

除了许多其他区别之外,df[j] 表示名为 j 的列,df[j][i] 表示名为 j 的列,以及名为 i 的元素(此处为行)。

df.iloc[i, j] 表示i-th 行和j-th 列中的元素从0开始。

所以,df.loc 通过label 选择数据(字符串或int 或任何其他格式,在本例中为int),df.iloc 通过position 选择数据。巧合的是,在您的示例中,i-th 行名为 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的行

【讨论】:

  • 我明白了,所以只要我的行从 0 到 n 排序,这将起作用,但如果它们的命名不同(比如我碰巧从 1 而不是 0 开始排序),则不会'保持一致。总的来说,我应该坚持使用 iloc。
  • 是的,按位置选择数据,我强烈建议你使用df.iloc[i, j]
  • 实际上我注意到行不是问题,即使它们的名称不同,这仍然会选择正确的行。列是可能导致问题的原因。请参阅上面的编辑。
  • 不准确。如果索引(行)的dtype是'str',并且你使用df[4][1],你可能会得到结果。尝试 df.index = [0, 2] 在行名中不带 int 1,df[4][1] 将引发 except。
  • 我明白了,是的,这是有道理的。非常感谢您花时间解释这一点。我正在使用 str ,这当然会有所不同。我将在上面的原始帖子中更改我的编辑。非常感谢!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-26
  • 1970-01-01
  • 2021-08-16
  • 2022-11-18
  • 2018-06-30
  • 2016-03-28
  • 1970-01-01
相关资源
最近更新 更多