假设我有一只大熊猫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
结果的解释是什么?Series
和DataFrame
之间在此问题上存在不一致?答案 0 :(得分:2)
我认为第一个问题的答案是tuples
用于定位MultiIndex
。我认为除了你在代码中分别暴露了一个错误和不一致之外,对后两个问题有很好的答案(这不是很难做:))。
所以Series
抱怨因为你没有
MultiIndex
或者更一般地说,元组的长度大于索引中的级别数。
DataFrame
应该以相同的方式作出反应,但不应该。
我认为最安全的方法是为tuples
保留MultiIndex
并使用lists / arrays / series来索引多行。
作为旁注,您将使用元组的列表/数组来选择MultiIndex
中的多个行。
答案 1 :(得分:2)
很难以系统的方式回答这个问题,所以我只会回答列表式的问题:
()
是标准方式时,为什么要使用[]
代替[]
?df.loc
在这里工作而s.loc
没有这样做是不公平的。两者都没有保证在这里工作(根据文档),但df.loc
碰巧。此外,df.loc
很可能在将来的版本中停止工作。 loc/iloc/ix
的示例无法按照文档中所示工作,则应指出并报告为错误。我不相信任何上述内容属于那个类别,但我当然可能错了。