@@ -101,23 +101,30 @@ def _getitem_tuple(self, tup):
101
101
# no shortcut needed
102
102
retval = self .obj
103
103
for i , key in enumerate (tup ):
104
- # hack?
104
+ if i >= self .obj .ndim :
105
+ raise IndexingError ('Too many indexers' )
106
+
107
+ if _is_null_slice (key ):
108
+ continue
109
+
105
110
retval = retval .ix ._getitem_axis (key , axis = i )
106
111
107
112
return retval
108
113
109
114
def _getitem_lowerdim (self , tup ):
110
115
from pandas .core .frame import DataFrame
111
116
117
+ ax0 = self .obj ._get_axis (0 )
112
118
# a bit kludgy
113
- if isinstance (self . obj . _get_axis ( 0 ) , MultiIndex ):
119
+ if isinstance (ax0 , MultiIndex ):
114
120
try :
115
121
return self ._get_label (tup , axis = 0 )
116
122
except TypeError :
117
123
# slices are unhashable
118
124
pass
119
125
except Exception :
120
- raise
126
+ if tup [0 ] not in ax0 :
127
+ raise
121
128
122
129
# to avoid wasted computation
123
130
# df.ix[d1:d2, 0] -> columns first (True)
@@ -148,12 +155,14 @@ def _getitem_lowerdim(self, tup):
148
155
raise IndexingError ('not applicable' )
149
156
150
157
def _getitem_axis (self , key , axis = 0 ):
158
+ labels = self .obj ._get_axis (axis )
151
159
if isinstance (key , slice ):
152
160
return self ._get_slice_axis (key , axis = axis )
153
- elif _is_list_like (key ):
161
+ elif _is_list_like (key ) and not (isinstance (key , tuple ) and
162
+ isinstance (labels , MultiIndex )):
163
+
154
164
return self ._getitem_iterable (key , axis = axis )
155
165
elif axis == 0 :
156
- labels = self .obj ._get_axis (0 )
157
166
is_int_index = _is_integer_index (labels )
158
167
159
168
idx = key
@@ -374,6 +383,10 @@ def _maybe_convert_ix(*args):
374
383
else :
375
384
return args
376
385
386
+ def _is_null_slice (obj ):
387
+ return (isinstance (obj , slice ) and obj .start is None and
388
+ obj .stop is None and obj .step is None )
389
+
377
390
def _is_integer_dtype (arr ):
378
391
return issubclass (arr .dtype .type , np .integer )
379
392
0 commit comments