Skip to content

Commit 19d5974

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 a31d603 commit 19d5974

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
@@ -3045,9 +3045,10 @@ def _update_indexer(idxr, indexer=indexer):
30453045
indexer = Index(np.arange(n))
30463046
if idxr is None:
30473047
return indexer
3048-
return indexer & idxr
3048+
return idxr & indexer
30493049

3050-
for i, k in enumerate(seq):
3050+
for i, k in enumerate(reversed(seq)):
3051+
i = len(seq) - 1 - i # Counting in reverse
30513052

30523053
if com.is_bool_indexer(k):
30533054
# a boolean indexer, must be the same length!
@@ -3063,21 +3064,31 @@ def _update_indexer(idxr, indexer=indexer):
30633064
idxrs = _convert_to_indexer(
30643065
self._get_level_indexer(x, level=i, indexer=indexer)
30653066
)
3066-
indexers = idxrs if indexers is None else indexers | idxrs
3067+
# We intersect with indexer to make idxrs
3068+
# ordered as previously seen indexes
3069+
if indexer is not None:
3070+
idxrs = indexer.intersection(idxrs)
3071+
3072+
indexers = (
3073+
idxrs
3074+
if indexers is None
3075+
else indexers.union(idxrs, sort=False)
3076+
)
30673077
except KeyError:
3068-
30693078
# ignore not founds
30703079
continue
30713080

30723081
if indexers is not None:
3073-
indexer = _update_indexer(indexers, indexer=indexer)
3082+
# No need to update anymore, as we intersect in main loop
3083+
indexer = indexers
30743084
else:
30753085
# no matches we are done
30763086
return Int64Index([])._ndarray_values
30773087

30783088
elif com.is_null_slice(k):
30793089
# empty slice
3080-
indexer = _update_indexer(None, indexer=indexer)
3090+
# index is given to conserve the order of this level
3091+
indexer = _update_indexer(Int64Index(np.arange(n)), indexer=indexer)
30813092

30823093
elif isinstance(k, slice):
30833094

0 commit comments

Comments
 (0)