在Python系列的层次化索引中,x[1, 2]和x[1][2]之间有什么区别?

4

我有一系列的

x=pd.Series(np.random.random(16),index=[[1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4],['a','b','c','d','a','b','c','d','a','b','c','d','a','b','c','d']]) 

看起来像这样:

1  a   -0.068167
   b   -1.036551
   c   -0.246619
   d    1.318381
2  a   -0.119061
   b    0.249653
   c    0.819153
   d    1.334510
3  a    0.029305
   b   -0.879798
   c    1.081574
   d   -1.590322
4  a    0.620149
   b   -2.197523
   c    0.927573
   d   -0.274370
dtype: float64

x[1,'a']和x[1]['a']有什么区别?它们给我的答案是相同的。我不明白内部的差异是什么?我应该在什么时候使用上述两个索引?


1
哪个库提供了这个 Series 对象? - zwol
Pandas库 - Kaushik
2个回答

2
这个解释来自于numpy文档,然而我相信在pandas中也会发生类似的事情(它使用numpy内部的“索引器”来提供一个映射,将可能被命名的索引和基于整数的底层索引联系起来)。
请注意,x[0,2] = x[0][2],尽管第二种情况效率较低,因为在第一个索引之后创建了一个新的临时数组,随后被索引到2。
以下是您系列的计时;第一种方法大约快30倍:
In [79]: %timeit x[1, 'a']
100000 loops, best of 3: 8.46 µs per loop

In [80]: %timeit x[1]['a']
1000 loops, best of 3: 274 µs per loop

1
这与numpy无关,是pandas特定的MultiIndex问题,请更新答案以避免误导。 - Jeff
@jeff 我不会说它与numpy无关?! - maxymoo
1
使用NumPy数组,x[1]将会是一个视图,性能差异会更小。我认为对这个问题的适当回答需要更多关于Pandas索引操作的具体见解。 - user2357112

1
x[1, 'a']的情况下,pandas将1,'a'视为元组(1,'a'),并返回对应于索引标签(1,'a')的系列值。
x[1]['a']的情况下,pandas发现你在[]中传递的不是元组,它无法用其索引进行引用,因此最终确定它可能是对第一级元素的引用。然后x[1]返回x的交叉部分,我们再尝试使用['a']进行切片。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接