Skip to content

Commit 694c769

Browse files
committed
BUG: loc() return in order for MultiIndex Dataframe
From issue pandas-dev#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 4bd7e62 commit 694c769

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
@@ -2993,9 +2993,10 @@ def _update_indexer(idxr, indexer=indexer):
29932993
indexer = Index(np.arange(n))
29942994
if idxr is None:
29952995
return indexer
2996-
return indexer & idxr
2996+
return idxr & indexer
29972997

2998-
for i, k in enumerate(seq):
2998+
for i, k in enumerate(reversed(seq)):
2999+
i = len(seq) - 1 - i # Counting in reverse
29993000

30003001
if com.is_bool_indexer(k):
30013002
# a boolean indexer, must be the same length!
@@ -3011,21 +3012,31 @@ def _update_indexer(idxr, indexer=indexer):
30113012
idxrs = _convert_to_indexer(
30123013
self._get_level_indexer(x, level=i, indexer=indexer)
30133014
)
3014-
indexers = idxrs if indexers is None else indexers | idxrs
3015+
# We intersect with indexer to make idxrs
3016+
# ordered as previously seen indexes
3017+
if indexer is not None:
3018+
idxrs = indexer.intersection(idxrs)
3019+
3020+
indexers = (
3021+
idxrs
3022+
if indexers is None
3023+
else indexers.union(idxrs, sort=False)
3024+
)
30153025
except KeyError:
3016-
30173026
# ignore not founds
30183027
continue
30193028

30203029
if indexers is not None:
3021-
indexer = _update_indexer(indexers, indexer=indexer)
3030+
# No need to update anymore, as we intersect in main loop
3031+
indexer = indexers
30223032
else:
30233033
# no matches we are done
30243034
return Int64Index([])._ndarray_values
30253035

30263036
elif com.is_null_slice(k):
30273037
# empty slice
3028-
indexer = _update_indexer(None, indexer=indexer)
3038+
# index is given to conserve the order of this level
3039+
indexer = _update_indexer(Int64Index(np.arange(n)), indexer=indexer)
30293040

30303041
elif isinstance(k, slice):
30313042

0 commit comments

Comments
 (0)