Skip to content

Commit af5c678

Browse files
committed
BUG: sort MultiIndex DataFrame loc result
From issue pandas-dev#22797. When given a list like object as indexer, the returned result did not respect the order of the indexer, but the order of the MultiIndex levels.
1 parent 2753c79 commit af5c678

File tree

1 file changed

+24
-0
lines changed

1 file changed

+24
-0
lines changed

pandas/core/indexes/multi.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3081,6 +3081,30 @@ def _update_indexer(idxr, indexer=indexer):
30813081
# empty indexer
30823082
if indexer is None:
30833083
return Int64Index([])._ndarray_values
3084+
3085+
# Generate tuples of keys by wich to order the results
3086+
keys = tuple()
3087+
for i, k in enumerate(seq):
3088+
if com.is_bool_indexer(k):
3089+
new_order = np.arange(n)[indexer]
3090+
elif is_list_like(k):
3091+
# Generate a map with all level codes as sorted initially
3092+
key_order_map = np.ones(len(self.levels[i]), dtype=np.uint64) * len(
3093+
self.levels[i]
3094+
)
3095+
# Set order as given in the indexer list
3096+
for p, e in enumerate(k):
3097+
if e in self.levels[i]:
3098+
key_order_map[self.levels[i].get_loc(e)] = p
3099+
new_order = key_order_map[self.codes[i][indexer]]
3100+
else:
3101+
# For all other case, use the same order as the level
3102+
new_order = np.arange(n)[indexer]
3103+
keys = (new_order,) + keys
3104+
if len(keys) > 0:
3105+
ind = np.lexsort(keys)
3106+
indexer = indexer[ind]
3107+
30843108
return indexer._ndarray_values
30853109

30863110
# --------------------------------------------------------------------

0 commit comments

Comments
 (0)