Pandas索引器方法和元组作为参数

时间:2016-03-24 10:20:43

标签: python pandas

假设我有一只大熊猫Series,我想在特定的索引处访问一组元素,如下所示:

In [1]:
from pandas import Series
import numpy as np

s = Series(np.arange(0,10))

In [2]: s.loc[[3,7]]

Out[2]:
3    3
7    7
dtype: int64

.loc方法接受list作为此类选择的参数。 .iloc.ix方法的工作方式相同。

但是,如果我使用tuple作为参数,则.loc.iloc都会失败:

In [5]: s.loc[(3,7)]
---------------------------------------------------------------------------
IndexingError                             Traceback (most recent call last)
........
IndexingError: Too many indexers

In [6]: s.iloc[(3,7)]
---------------------------------------------------------------------------
IndexingError                             Traceback (most recent call last)
........

IndexingError: Too many indexers

.ix会产生一个奇怪的结果:

In [7]: s.ix[(3,7)]
Out[7]: 3

现在,我知道您甚至无法使用原始python list执行此操作:

In [27]:
x = list(range(0,10))
x[(3,7)]

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-27-cefdde088328> in <module>()
      1 x = list(range(0,10))
----> 2 x[(3,7)]

TypeError: list indices must be integers or slices, not tuple

要从list检索一组特定索引,您需要使用理解as explained here

但另一方面,使用tuple从pandas DataFrame中选择行似乎适用于所有三种索引方法。以下是使用.loc方法的示例:

In [8]:
from pandas import DataFrame
df = DataFrame({"x" : np.arange(0,10)})

In [9]:
df.loc[(3,7),"x"]

Out[9]:
3    3
7    7
Name: x, dtype: int64

我的三个问题是:

  • 为什么Series索引器不会接受tuple?看起来很像 自然使用tuple,因为所需的索引集是一个
    不可变的一次性参数。这仅仅是出于此目的 模仿list界面?
  • 奇怪的Series .ix结果的解释是什么?
  • 为什么SeriesDataFrame之间在此问题上存在不一致?

2 个答案:

答案 0 :(得分:2)

我认为第一个问题的答案是tuples用于定位MultiIndex。我认为除了你在代码中分别暴露了一个错误和不一致之外,对后两个问题有很好的答案(这不是很难做:))。 所以Series抱怨因为你没有 MultiIndex或者更一般地说,元组的长度大于索引中的级别数。 DataFrame应该以相同的方式作出反应,但不应该。 我认为最安全的方法是为tuples保留MultiIndex并使用lists / arrays / series来索引多行。 作为旁注,您将使用元组的列表/数组来选择MultiIndex中的多个行。

答案 1 :(得分:2)

很难以系统的方式回答这个问题,所以我只会回答列表式的问题:

  1. 我认为更大的问题可能是你究竟想要做什么但却无法做到?即当()是标准方式时,为什么要使用[]代替[]
  2. 你的第一个问题实际上就是为什么语法是一种特定的方式,这几乎是一个不可能回答的问题,而不是深入到不只是大熊猫的历史而且还有numpy。无论如何,@ JoeCondron的简单答案是正确的:元组用于多索引,列表用于高级索引(又名“花式索引”)。我相信花哨的索引是直接从numpy中提取的,并且大熊猫添加了多个索引。
  3. 对于你的上一个问题,我猜这是一个不一致的问题,但系列和数据框架并不完全相同,所以它们的行为不可能100%一致。特别是,DataFrame索引需要额外的机制来区分行和列,而系列只需要担心行。
  4. 从一般意义上回答你的问题,我认为你在这里展示的是,当你使用非标准语法时,可能仍可按你的意愿工作,但它可能不会。所以我认为df.loc在这里工作而s.loc没有这样做是不公平的。两者都没有保证在这里工作(根据文档),但df.loc碰巧。此外,df.loc很可能在将来的版本中停止工作。
  5. 如果您确实发现loc/iloc/ix 的示例无法按照文档中所示工作,则应指出并报告为错误。我不相信任何上述内容属于那个类别,但我当然可能错了。
相关问题