python dataframe index loc_python – 使用DataFrame.loc的“太多索引器”

本文讨论了在使用pandas DataFrame.loc时遇到的问题,特别是当尝试从多级索引中选择数据时。通过示例展示了如何正确选择特定级别的索引值,同时指出了尝试选择所有第一级索引时出现的错误。文章提出了这种行为可能存在的不一致性,并提到了替代的选取方法,如使用df.xs()函数。
摘要由CSDN通过智能技术生成

我已经阅读了7000万次,但我从来没有理解它,所以我仍然试图弄清楚如何使用loc来切割带有MultiIndex的DataFrame.

我将从this SO answer开始使用DataFrame:

value

first second third fourth

A0 B0 C1 D0 2

D1 3

C3 D0 6

D1 7

B1 C1 D0 10

D1 11

C3 D0 14

D1 15

A1 B0 C1 D0 18

D1 19

C3 D0 22

D1 23

B1 C1 D0 26

D1 27

C3 D0 30

D1 31

A2 B0 C1 D0 34

D1 35

C3 D0 38

D1 39

B1 C1 D0 42

D1 43

C3 D0 46

D1 47

A3 B0 C1 D0 50

D1 51

C3 D0 54

D1 55

B1 C1 D0 58

D1 59

C3 D0 62

D1 63

要仅选择A0和C1值,我可以这样做:

In [26]: df.loc['A0', :, 'C1', :]

Out[26]:

value

first second third fourth

A0 B0 C1 D0 2

D1 3

B1 C1 D0 10

D1 11

哪个也可以从三个级别进行选择,甚至使用元组:

In [28]: df.loc['A0', :, ('C1', 'C2'), 'D1']

Out[28]:

value

first second third fourth

A0 B0 C1 D1 3

C2 D1 5

B1 C1 D1 11

C2 D1 13

到目前为止,直观而精彩.

那么为什么我不能从第一个索引级别中选择所有值呢?

In [30]: df.loc[:, :, 'C1', :]

---------------------------------------------------------------------------

IndexingError Traceback (most recent call last)

in ()

----> 1 df.loc[:, :, 'C1', :]

/usr/local/lib/python2.7/dist-packages/pandas/core/indexing.pyc in __getitem__(self, key)

1176 def __getitem__(self, key):

1177 if type(key) is tuple:

-> 1178 return self._getitem_tuple(key)

1179 else:

1180 return self._getitem_axis(key, axis=0)

/usr/local/lib/python2.7/dist-packages/pandas/core/indexing.pyc in _getitem_tuple(self, tup)

694

695 # no multi-index, so validate all of the indexers

--> 696 self._has_valid_tuple(tup)

697

698 # ugly hack for GH #836

/usr/local/lib/python2.7/dist-packages/pandas/core/indexing.pyc in _has_valid_tuple(self, key)

125 for i, k in enumerate(key):

126 if i >= self.obj.ndim:

--> 127 raise IndexingError('Too many indexers')

128 if not self._has_valid_type(k, i):

129 raise ValueError("Location based indexing can only have [%s] "

IndexingError: Too many indexers

当然这不是预期的行为吗?

注意:我知道这可以用df.xs(‘C1′,level =’third’),但当前的.loc行为似乎不一致.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值