【问题标题】:What is Pandas doing here that my indexes [0] and [1] refer to the same value?Pandas 在这里做什么,我的索引 [0] 和 [1] 引用相同的值?
【发布时间】:2016-12-16 02:12:25
【问题描述】:

我有一个包含这些索引和值的数据框:

df[df.columns[0]]

1              example

2              example1

3              example2

当我访问 df[df.columns[0]][2] 时,我得到“example1”。说得通。这就是索引的工作方式。

但是,当我访问 df[df.columns[0]] 时,我得到了“示例”,当我访问 df[df.columns[1]] 时,我也得到了示例。所以对于

df[df.columns[0]][0]

df[df.columns[0]][1]

我得到“示例”。

奇怪的是,我可以删除“行”0,结果是1被删除了:

gf = df.drop(df.index[[0]])

gf



exampleDF   
2   example1

3   example2

但是当我删除第 1 行时,那么

2 example1

被删除,而不是示例。

这让我有点困惑; Pandas 中关于行索引的标准是否不一致,或者我是否遗漏了什么/犯了错误?

【问题讨论】:

  • 了解如何将数据放入数据框中可能会有所帮助。
  • 只是通过 'pd.read_excel("sheet.xlsx")',虽然我已经对它做了很多操作,但添加起来太长了......操纵会导致这种现象吗?谢谢。

标签: python pandas


【解决方案1】:

您可能导致 pandas 在.iloc(基于索引)和.loc(基于标签)索引之间切换。

Python 中的所有数组都是 0 索引的。而且我注意到您的 DataFrame 中的索引从 1 开始。因此,当您运行 df[df.column[0]][0] 时,pandas 意识到没有名为 0 的索引,并回退到 .iloc,它通过数组索引定位事物。因此它返回它在数组的第一个位置找到的内容,即'example'

但是,当您运行 df[df.column[0]][1] 时,pandas 意识到有一个索引标签 1,并使用 .loc 返回它在该标签处找到的内容,这又恰好是 'example'

当您删除第一行时,您的 DataFrame 没有索引标签 0 和 1。因此,当您以您的方式在这些位置定位元素时,它不会返回 None 给您,而是下降回到基于数组的索引并返回数组中第 0 和第 1 位的元素。

要强制 pandas 使用两种索引技术之一,请使用 .iloc.loc.loc 是基于标签的,如果您尝试 df[df.column[0]].loc[0],将引发 KeyError.iloc 是基于索引的,当您尝试 df[df.column[0]].iloc[0] 时将返回 'example'


补充说明

这些命令是不好的做法:df[col_label].iloc[row_index]; df[col_label].loc[row_label].

请使用df.loc[row_label, col_label];或df.iloc[row_index, col_index];或df.ix[row_label_or_index, col_label_or_index]

更多信息请参见Different Choices for Indexing

【讨论】:

  • 我没有意识到这种区别。我很感激。如果您不介意,如果我要在根据某些标准删除后检查缺失的索引(即自然数之间的缺失),是否有我应该注意的“最佳实践”?
  • 有几种方法可以处理索引,例如.reset_index.reindex,它们将重置您的索引或重新索引您的DataFrame。但是 Pandas 更面向行,因此您很少使用行索引。就像在您的示例中一样,您编写了df[df.columns[0]],这表明df 的第一个索引是列名。这与数组(例如 numpy)的工作方式不同。如果您有一个 2D numpy 数组,arr[0] 始终是第 0 行。要获得该专栏,您需要arr[:, 0]。还有其他 pandas 的方法首先应用于列,需要明确指定才能应用于行。
  • 我无法重现这个。如果没有名为 0 的索引,则会引发键错误。我也无法重现 OP 提到的行为。
  • 好的,由于您提到的原因,当您有混合类型索引时会发生这种情况。
猜你喜欢
  • 1970-01-01
  • 2020-10-19
  • 2018-06-25
  • 1970-01-01
  • 2017-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多