@@ -2931,17 +2931,22 @@ def get_loc_level(self, key, level=0, drop_level: bool = True):
2931
2931
level = self ._get_level_number (level )
2932
2932
else :
2933
2933
level = [self ._get_level_number (lev ) for lev in level ]
2934
- return self ._get_loc_level (key , level = level , drop_level = drop_level )
2935
2934
2936
- def _get_loc_level (self , key , level : int | list [int ] = 0 , drop_level : bool = True ):
2935
+ loc , mi = self ._get_loc_level (key , level = level )
2936
+ if not drop_level :
2937
+ if lib .is_integer (loc ):
2938
+ mi = self [loc : loc + 1 ]
2939
+ else :
2940
+ mi = self [loc ]
2941
+ return loc , mi
2942
+
2943
+ def _get_loc_level (self , key , level : int | list [int ] = 0 ):
2937
2944
"""
2938
2945
get_loc_level but with `level` known to be positional, not name-based.
2939
2946
"""
2940
2947
2941
2948
# different name to distinguish from maybe_droplevels
2942
- def maybe_mi_droplevels (indexer , levels , drop_level : bool ):
2943
- if not drop_level :
2944
- return self [indexer ]
2949
+ def maybe_mi_droplevels (indexer , levels ):
2945
2950
# kludge around
2946
2951
orig_index = new_index = self [indexer ]
2947
2952
@@ -2969,7 +2974,7 @@ def maybe_mi_droplevels(indexer, levels, drop_level: bool):
2969
2974
2970
2975
result = loc if result is None else result & loc
2971
2976
2972
- return result , maybe_mi_droplevels (result , level , drop_level )
2977
+ return result , maybe_mi_droplevels (result , level )
2973
2978
2974
2979
# kludge for #1796
2975
2980
if isinstance (key , list ):
@@ -2980,7 +2985,7 @@ def maybe_mi_droplevels(indexer, levels, drop_level: bool):
2980
2985
try :
2981
2986
if key in self .levels [0 ]:
2982
2987
indexer = self ._get_level_indexer (key , level = level )
2983
- new_index = maybe_mi_droplevels (indexer , [0 ], drop_level )
2988
+ new_index = maybe_mi_droplevels (indexer , [0 ])
2984
2989
return indexer , new_index
2985
2990
except (TypeError , InvalidIndexError ):
2986
2991
pass
@@ -2995,7 +3000,7 @@ def partial_selection(key, indexer=None):
2995
3000
ilevels = [
2996
3001
i for i in range (len (key )) if key [i ] != slice (None , None )
2997
3002
]
2998
- return indexer , maybe_mi_droplevels (indexer , ilevels , drop_level )
3003
+ return indexer , maybe_mi_droplevels (indexer , ilevels )
2999
3004
3000
3005
if len (key ) == self .nlevels and self .is_unique :
3001
3006
# Complete key in unique index -> standard get_loc
@@ -3030,10 +3035,10 @@ def partial_selection(key, indexer=None):
3030
3035
if indexer is None :
3031
3036
indexer = slice (None , None )
3032
3037
ilevels = [i for i in range (len (key )) if key [i ] != slice (None , None )]
3033
- return indexer , maybe_mi_droplevels (indexer , ilevels , drop_level )
3038
+ return indexer , maybe_mi_droplevels (indexer , ilevels )
3034
3039
else :
3035
3040
indexer = self ._get_level_indexer (key , level = level )
3036
- return indexer , maybe_mi_droplevels (indexer , [level ], drop_level )
3041
+ return indexer , maybe_mi_droplevels (indexer , [level ])
3037
3042
3038
3043
def _get_level_indexer (self , key , level : int = 0 , indexer = None ):
3039
3044
# `level` kwarg is _always_ positional, never name
@@ -3268,9 +3273,7 @@ def _update_indexer(idxr: Index | None, indexer: Index | None, key) -> Index:
3268
3273
else :
3269
3274
# a single label
3270
3275
indexer = _update_indexer (
3271
- _convert_to_indexer (
3272
- self .get_loc_level (k , level = i , drop_level = False )[0 ]
3273
- ),
3276
+ _convert_to_indexer (self ._get_loc_level (k , level = i )[0 ]),
3274
3277
indexer = indexer ,
3275
3278
key = seq ,
3276
3279
)
0 commit comments