【问题标题】:DataFrame.drop works with lists but not tuplesDataFrame.drop 适用于列表但不适用于元组
【发布时间】:2019-08-06 05:53:26
【问题描述】:

我觉得当tuple 传递给DataFrame.drop() 时,它会引发错误,但当list 传递时它可以工作。

鉴于此数据框:

df = pd.DataFrame(np.arange(12).reshape(3, 4),columns=['A', 'B', 'C', 'D'])

以下作品:

df.drop(['A', 'B'], axis=1)

但以下不是:

df.drop(('A', 'B'), axis=1)

错误:

KeyError: "[('A', 'B')] not found in axis"

该错误使代码尝试执行的操作更加清晰,但对我来说仍然没有意义。我忽略了什么吗?

【问题讨论】:

  • 正如documentation 所述,您可以将它传递给list like 对象。为什么要改为传递元组?在我看来,这里没有太多的直觉,只是 API 是如何设计的。
  • 我在问之前阅读了文档。 'list-like' - 对我来说,一个元组就像列表一样。我知道它是不可变的,但这正是您想要使用“不可变列表”的地方。

标签: python python-3.x pandas dataframe


【解决方案1】:

tuples 是不可变和可散列的对象,因此,您可能将tuples 作为数据框中的索引。然而,它们也是可迭代的,所以这是一个模棱两可的来源:当使用元组时,你是指一个可迭代的对象还是一个对象本身?由于它们是可散列的,pandas 将其解释为后者,并在您的情况下尝试查找以元组 ('A', 'B') 作为名称的列。

另一方面,lists 不可散列,因为它们是可变的,并且您不能将它们作为索引/列。因此,这里没有歧义:当你传递一个列表时,你总是指一个可迭代的。

【讨论】:

  • 是的,我在问之前阅读了文档 - 我认为他们需要使用可变/不可变而不是“类似列表” - 元组就是类似列表。
  • @s5s 不完全...像对象这样的列表是可变的可迭代对象,元组是不可变的。这就是为什么 multiIndex 键在内部由元组表示。
猜你喜欢
  • 1970-01-01
  • 2020-08-07
  • 1970-01-01
  • 2017-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多