@@ -31,7 +31,7 @@ def __getitem__(self, key):
31
31
else :
32
32
return self ._getitem_axis (key , axis = 0 )
33
33
34
- def _get (self , label , axis = 0 ):
34
+ def _get_label (self , label , axis = 0 ):
35
35
try :
36
36
return self .obj .xs (label , axis = axis , copy = False )
37
37
except Exception :
@@ -96,7 +96,7 @@ def _getitem_tuple(self, tup):
96
96
# a bit kludgy
97
97
if isinstance (self .obj ._get_axis (0 ), MultiIndex ):
98
98
try :
99
- return self ._get (tup , axis = 0 )
99
+ return self ._get_label (tup , axis = 0 )
100
100
except (KeyError , TypeError ):
101
101
pass
102
102
@@ -156,40 +156,36 @@ def _getitem_axis(self, key, axis=0):
156
156
if com .is_integer (key ):
157
157
if isinstance (labels , MultiIndex ):
158
158
try :
159
- return self ._get (key , axis = 0 )
159
+ return self ._get_label (key , axis = 0 )
160
160
except (KeyError , TypeError ):
161
161
if _is_integer_index (self .obj .index .levels [0 ]):
162
162
raise
163
163
164
164
if not is_int_index :
165
165
idx = labels [key ]
166
166
167
- return self ._get (idx , axis = 0 )
167
+ return self ._get_label (idx , axis = 0 )
168
168
else :
169
169
labels = self .obj ._get_axis (axis )
170
170
lab = key
171
171
if com .is_integer (key ) and not _is_integer_index (labels ):
172
172
lab = labels [key ]
173
- return self ._get (lab , axis = axis )
173
+ return self ._get_label (lab , axis = axis )
174
174
175
175
def _getitem_iterable (self , key , axis = 0 ):
176
176
labels = self .obj ._get_axis (axis )
177
177
axis_name = self .obj ._get_axis_name (axis )
178
178
179
- # asarray can be unsafe, NumPy strings are weird
180
- if isinstance (key , Index ):
181
- # want Index objects to pass through untouched
182
- keyarr = key
183
- else :
184
- keyarr = _asarray_tuplesafe (key )
185
-
186
- if keyarr .dtype == np .bool_ :
187
- if _is_series (key ):
188
- if not key .index .equals (labels ):
189
- raise IndexingError ('Cannot use boolean index with '
190
- 'misaligned or unequal labels' )
179
+ if com ._is_bool_indexer (key ):
180
+ key = _check_bool_indexer (labels , key )
191
181
return self .obj .reindex (** {axis_name : labels [np .asarray (key )]})
192
182
else :
183
+ if isinstance (key , Index ):
184
+ # want Index objects to pass through untouched
185
+ keyarr = key
186
+ else :
187
+ # asarray can be unsafe, NumPy strings are weird
188
+ keyarr = _asarray_tuplesafe (key )
193
189
if _is_integer_dtype (keyarr ) and not _is_integer_index (labels ):
194
190
keyarr = labels .take (keyarr )
195
191
@@ -244,14 +240,12 @@ def _convert_to_indexer(self, obj, axis=0):
244
240
return slicer
245
241
246
242
elif _is_list_like (obj ):
247
- objarr = _asarray_tuplesafe (obj )
248
-
249
- if objarr .dtype == np .bool_ :
250
- if not obj .index .equals (labels ):
251
- raise IndexingError ('Cannot use boolean index with '
252
- 'misaligned or unequal labels' )
243
+ if com ._is_bool_indexer (obj ):
244
+ objarr = _check_bool_indexer (labels , obj )
253
245
return objarr
254
246
else :
247
+ objarr = _asarray_tuplesafe (obj )
248
+
255
249
# If have integer labels, defer to label-based indexing
256
250
if _is_integer_dtype (objarr ) and not is_int_index :
257
251
return objarr
@@ -330,14 +324,33 @@ class _SeriesIndexer(_NDFrameIndexer):
330
324
>>> ts.ix[date1:date2] = 0
331
325
"""
332
326
333
- def _get (self , label , axis = 0 ):
334
- return self .obj [ label ]
327
+ def _get_integer (self , indexer , axis = 0 ):
328
+ return self .obj . _get_values ( indexer )
335
329
336
- def _slice (self , obj , axis = 0 ):
337
- return self .obj [obj ]
330
+ def _get_label (self , key , axis = 0 ):
331
+ return self .obj [key ]
332
+
333
+ def _slice (self , indexer , axis = 0 ):
334
+ return self .obj ._get_values (indexer )
338
335
339
336
def _setitem_with_indexer (self , indexer , value ):
340
- self .obj [indexer ] = value
337
+ self .obj ._set_values (indexer , value )
338
+
339
+ def _check_bool_indexer (ax , key ):
340
+ # boolean indexing, need to check that the data are aligned, otherwise
341
+ # disallowed
342
+ result = key
343
+ if _is_series (key ) and key .dtype == np .bool_ :
344
+ if not key .index .equals (ax ):
345
+ result = key .reindex (ax )
346
+
347
+ if isinstance (result , np .ndarray ) and result .dtype == np .object_ :
348
+ mask = com .isnull (result )
349
+ if mask .any ():
350
+ raise IndexingError ('cannot index with vector containing '
351
+ 'NA / NaN values' )
352
+
353
+ return result
341
354
342
355
def _is_series (obj ):
343
356
from pandas .core .series import Series
@@ -395,4 +408,3 @@ def _maybe_droplevels(index, key):
395
408
396
409
return index
397
410
398
- _isboolarr = lambda x : np .asarray (x ).dtype == np .bool_
0 commit comments