@@ -72,8 +72,8 @@ class MultiIndex(Index):
72
72
Examples
73
73
---------
74
74
A new ``MultiIndex`` is typically constructed using one of the helper
75
- methods :meth:`MultiIndex.from_arrays`` , :meth:`MultiIndex.from_product` `
76
- and :meth:`MultiIndex.from_tuples`` . For example (using ``.from_arrays``):
75
+ methods :meth:`MultiIndex.from_arrays`, :meth:`MultiIndex.from_product`
76
+ and :meth:`MultiIndex.from_tuples`. For example (using ``.from_arrays``):
77
77
78
78
>>> arrays = [[1, 1, 2, 2], ['red', 'blue', 'red', 'blue']]
79
79
>>> pd.MultiIndex.from_arrays(arrays, names=('number', 'color'))
@@ -1982,33 +1982,41 @@ def _partial_tup_index(self, tup, side='left'):
1982
1982
1983
1983
def get_loc (self , key , method = None ):
1984
1984
"""
1985
- Get integer location, slice or boolean mask for requested label or
1986
- tuple. If the key is past the lexsort depth, the return may be a
1987
- boolean mask array, otherwise it is always a slice or int.
1985
+ Get location for a label or a tuple of labels as an integer, slice or
1986
+ boolean mask.
1988
1987
1989
1988
Parameters
1990
1989
----------
1991
- key : label or tuple
1990
+ key : label or tuple of labels (one for each level)
1992
1991
method : None
1993
1992
1994
1993
Returns
1995
1994
-------
1996
1995
loc : int, slice object or boolean mask
1996
+ If the key is past the lexsort depth, the return may be a
1997
+ boolean mask array, otherwise it is always a slice or int.
1997
1998
1998
1999
Examples
1999
2000
---------
2000
2001
>>> mi = pd.MultiIndex.from_arrays([list('abb'), list('def')])
2002
+
2001
2003
>>> mi.get_loc('b')
2002
2004
slice(1, 3, None)
2005
+
2003
2006
>>> mi.get_loc(('b', 'e'))
2004
2007
1
2005
2008
2009
+ Notes
2010
+ ------
2011
+ The key cannot be a slice, list of same-level labels, a boolean mask,
2012
+ or a sequence of such. If you want to use those, use
2013
+ :meth:`MultiIndex.get_locs` instead.
2014
+
2006
2015
See also
2007
2016
--------
2008
2017
Index.get_loc : get_loc method for (single-level) index.
2009
- get_locs : Given a tuple of slices/lists/labels/boolean indexer to a
2010
- level-wise spec, produce an indexer to extract those
2011
- locations.
2018
+ MultiIndex.get_locs : Get location for a label/slice/list/mask or a
2019
+ sequence of such.
2012
2020
"""
2013
2021
if method is not None :
2014
2022
raise NotImplementedError ('only the default get_loc method is '
@@ -2117,8 +2125,9 @@ def get_loc_level(self, key, level=0, drop_level=True):
2117
2125
2118
2126
See Also
2119
2127
---------
2120
- MultiIndex.get_loc : Get integer location, slice or boolean mask for
2121
- requested label or tuple.
2128
+ MultiIndex.get_loc : Get location for a label or a tuple of labels.
2129
+ MultiIndex.get_locs : Get location for a label/slice/list/mask or a
2130
+ sequence of such
2122
2131
"""
2123
2132
2124
2133
def maybe_droplevels (indexer , levels , drop_level ):
@@ -2328,23 +2337,41 @@ def convert_indexer(start, stop, step, indexer=indexer, labels=labels):
2328
2337
j = labels .searchsorted (loc , side = 'right' )
2329
2338
return slice (i , j )
2330
2339
2331
- def get_locs (self , tup ):
2340
+ def get_locs (self , seq ):
2332
2341
"""
2333
- Given a tuple of slices/lists/labels/boolean indexer to a level-wise
2334
- spec produce an indexer to extract those locations
2342
+ Get location for a given label/slice/list/mask or a sequence of such as
2343
+ an array of integers.
2335
2344
2336
2345
Parameters
2337
2346
----------
2338
- key : tuple of (slices/list/labels)
2347
+ seq : label/slice/list/mask or a sequence of such
2348
+ You should use one of the above for each level.
2349
+ If a level should not be used, set it to ``slice(None)``.
2339
2350
2340
2351
Returns
2341
2352
-------
2342
- locs : integer list of locations or boolean indexer suitable
2343
- for passing to iloc
2353
+ locs : array of integers suitable for passing to iloc
2354
+
2355
+ Examples
2356
+ ---------
2357
+ >>> mi = pd.MultiIndex.from_arrays([list('abb'), list('def')])
2358
+
2359
+ >>> mi.get_locs('b')
2360
+ array([1, 2], dtype=int64)
2361
+
2362
+ >>> mi.get_locs([slice(None), ['e', 'f']])
2363
+ array([1, 2], dtype=int64)
2364
+
2365
+ >>> mi.get_locs([[True, False, True], slice('e', 'f')])
2366
+ array([2], dtype=int64)
2367
+
2368
+ See also
2369
+ --------
2370
+ MultiIndex.get_loc : Get location for a label or a tuple of labels.
2344
2371
"""
2345
2372
2346
2373
# must be lexsorted to at least as many levels
2347
- true_slices = [i for (i , s ) in enumerate (is_true_slices (tup )) if s ]
2374
+ true_slices = [i for (i , s ) in enumerate (is_true_slices (seq )) if s ]
2348
2375
if true_slices and true_slices [- 1 ] >= self .lexsort_depth :
2349
2376
raise UnsortedIndexError ('MultiIndex slicing requires the index '
2350
2377
'to be lexsorted: slicing on levels {0}, '
@@ -2377,7 +2404,7 @@ def _update_indexer(idxr, indexer=indexer):
2377
2404
return indexer
2378
2405
return indexer & idxr
2379
2406
2380
- for i , k in enumerate (tup ):
2407
+ for i , k in enumerate (seq ):
2381
2408
2382
2409
if is_bool_indexer (k ):
2383
2410
# a boolean indexer, must be the same length!
0 commit comments