Skip to content

Commit b32bfee

Browse files
committed
BUG: loc() return in order for MultiIndex Dataframe
From issue #22797. Loc did not respect order for MultiIndex Dataframe. It does for single index. When possible, the returned row now respect the given order for keys.
1 parent 24721da commit b32bfee

File tree

1 file changed

+17
-6
lines changed

1 file changed

+17
-6
lines changed

pandas/core/indexes/multi.py

+17-6
Original file line numberDiff line numberDiff line change
@@ -3040,9 +3040,10 @@ def _update_indexer(idxr, indexer=indexer):
30403040
indexer = Index(np.arange(n))
30413041
if idxr is None:
30423042
return indexer
3043-
return indexer & idxr
3043+
return idxr & indexer
30443044

3045-
for i, k in enumerate(seq):
3045+
for i, k in enumerate(reversed(seq)):
3046+
i = len(seq) - 1 - i # Counting in reverse
30463047

30473048
if com.is_bool_indexer(k):
30483049
# a boolean indexer, must be the same length!
@@ -3058,21 +3059,31 @@ def _update_indexer(idxr, indexer=indexer):
30583059
idxrs = _convert_to_indexer(
30593060
self._get_level_indexer(x, level=i, indexer=indexer)
30603061
)
3061-
indexers = idxrs if indexers is None else indexers | idxrs
3062+
# We intersect with indexer to make idxrs
3063+
# ordered as previously seen indexes
3064+
if indexer is not None:
3065+
idxrs = indexer.intersection(idxrs)
3066+
3067+
indexers = (
3068+
idxrs
3069+
if indexers is None
3070+
else indexers.union(idxrs, sort=False)
3071+
)
30623072
except KeyError:
3063-
30643073
# ignore not founds
30653074
continue
30663075

30673076
if indexers is not None:
3068-
indexer = _update_indexer(indexers, indexer=indexer)
3077+
# No need to update anymore, as we intersect in main loop
3078+
indexer = indexers
30693079
else:
30703080
# no matches we are done
30713081
return Int64Index([])._ndarray_values
30723082

30733083
elif com.is_null_slice(k):
30743084
# empty slice
3075-
indexer = _update_indexer(None, indexer=indexer)
3085+
# index is given to conserve the order of this level
3086+
indexer = _update_indexer(Int64Index(np.arange(n)), indexer=indexer)
30763087

30773088
elif isinstance(k, slice):
30783089

0 commit comments

Comments
 (0)