Skip to content

Commit 7a6bdf3

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 cd939c6 commit 7a6bdf3

File tree

1 file changed

+24
-0
lines changed

1 file changed

+24
-0
lines changed

pandas/core/indexes/multi.py

+24
Original file line numberDiff line numberDiff line change
@@ -3052,6 +3052,30 @@ def _update_indexer(idxr, indexer=indexer):
30523052
# empty indexer
30533053
if indexer is None:
30543054
return Int64Index([])._ndarray_values
3055+
3056+
# Generate tuples of keys by wich to order the results
3057+
keys = tuple()
3058+
for i, k in enumerate(seq):
3059+
if com.is_bool_indexer(k):
3060+
new_order = np.arange(n)[indexer]
3061+
elif is_list_like(k):
3062+
# Generate a map with all level codes as sorted initially
3063+
key_order_map = np.ones(len(self.levels[i]), dtype=np.uint64) * len(
3064+
self.levels[i]
3065+
)
3066+
# Set order as given in the indexer list
3067+
for p, e in enumerate(k):
3068+
if e in self.levels[i]:
3069+
key_order_map[self.levels[i].get_loc(e)] = p
3070+
new_order = key_order_map[self.codes[i][indexer]]
3071+
else:
3072+
# For all other case, use the same order as the level
3073+
new_order = np.arange(n)[indexer]
3074+
keys = (new_order,) + keys
3075+
if len(keys) > 0:
3076+
ind = np.lexsort(keys)
3077+
indexer = indexer[ind]
3078+
30553079
return indexer._ndarray_values
30563080

30573081
def truncate(self, before=None, after=None):

0 commit comments

Comments
 (0)