@@ -123,6 +123,17 @@ def test_loc_multiindex_missing_label_raises(self):
123
123
with pytest .raises (KeyError , match = r"^2$" ):
124
124
df .loc [2 ]
125
125
126
+ # Lists with missing labels do not raise:
127
+ expected = df .iloc [[0 , 1 ]]
128
+ result = df .loc [[2 , 4 ]]
129
+ tm .assert_frame_equal (result , expected )
130
+
131
+ # ... even when none is found:
132
+ expected = df .iloc [[]]
133
+ for l in [2 ], [2 , 3 ]: # GH 27148
134
+ result = df .loc [l ]
135
+ tm .assert_frame_equal (result , expected )
136
+
126
137
def test_loc_multiindex_too_many_dims_raises (self ):
127
138
# GH 14885
128
139
s = Series (range (8 ), index = MultiIndex .from_product (
@@ -264,16 +275,16 @@ def convert_nested_indexer(indexer_type, keys):
264
275
tm .assert_series_equal (result , expected )
265
276
266
277
267
- @pytest .mark .parametrize ('indexer, is_level1, expected_error' , [
268
- ([], False , None ), # empty ok
269
- (['A' ], False , None ),
270
- (['A' , 'D' ], False , None ),
271
- (['D' ], False , r"\['D'\] not in index" ), # not any values found
272
- (pd .IndexSlice [:, ['foo' ]], True , None ),
273
- (pd .IndexSlice [:, ['foo' , 'bah' ]], True , None )
278
+ @pytest .mark .parametrize ('indexer, level' , [
279
+ ([], 0 ), # empty ok
280
+ (['A' ], 0 ),
281
+ (['A' , 'D' ], 0 ),
282
+ (['D' , 'E' ], - 1 ), # no values found - fine
283
+ (['D' ], - 1 ), # same, with single item list: GH 27148
284
+ (pd .IndexSlice [:, ['foo' ]], 1 ),
285
+ (pd .IndexSlice [:, ['foo' , 'bah' ]], 1 )
274
286
])
275
- def test_loc_getitem_duplicates_multiindex_missing_indexers (indexer , is_level1 ,
276
- expected_error ):
287
+ def test_loc_getitem_duplicates_multiindex_missing_indexers (indexer , level ):
277
288
# GH 7866
278
289
# multi-index slicing with missing indexers
279
290
idx = MultiIndex .from_product ([['A' , 'B' , 'C' ],
@@ -283,21 +294,20 @@ def test_loc_getitem_duplicates_multiindex_missing_indexers(indexer, is_level1,
283
294
284
295
if indexer == []:
285
296
expected = s .iloc [[]]
286
- elif is_level1 :
297
+ elif level == 1 :
287
298
expected = Series ([0 , 3 , 6 ], index = MultiIndex .from_product (
288
299
[['A' , 'B' , 'C' ], ['foo' ]], names = ['one' , 'two' ])).sort_index ()
300
+ elif level == - 1 :
301
+ # Empty: use idx[:0] as index to have appropriate (hidden) labels
302
+ expected = Series ([], index = idx [:0 ], dtype = 'int64' )
289
303
else :
290
304
exp_idx = MultiIndex .from_product ([['A' ], ['foo' , 'bar' , 'baz' ]],
291
305
names = ['one' , 'two' ])
292
306
expected = Series (np .arange (3 , dtype = 'int64' ),
293
307
index = exp_idx ).sort_index ()
294
308
295
- if expected_error is not None :
296
- with pytest .raises (KeyError , match = expected_error ):
297
- s .loc [indexer ]
298
- else :
299
- result = s .loc [indexer ]
300
- tm .assert_series_equal (result , expected )
309
+ result = s .loc [indexer ]
310
+ tm .assert_series_equal (result , expected )
301
311
302
312
303
313
def test_series_loc_getitem_fancy (
0 commit comments