From b58079901920ab726b3c7e001a7977664f106806 Mon Sep 17 00:00:00 2001 From: Joris Van den Bossche Date: Tue, 1 Nov 2016 15:58:57 +0100 Subject: [PATCH 1/3] PERF: casting loc to labels dtype before searchsorted --- pandas/indexes/multi.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pandas/indexes/multi.py b/pandas/indexes/multi.py index a9f452db69659..356fca0ba6de6 100644 --- a/pandas/indexes/multi.py +++ b/pandas/indexes/multi.py @@ -1907,6 +1907,7 @@ def convert_indexer(start, stop, step, indexer=indexer, labels=labels): return np.array(labels == loc, dtype=bool) else: # sorted, so can return slice object -> view + loc = labels.dtype.type(loc) i = labels.searchsorted(loc, side='left') j = labels.searchsorted(loc, side='right') return slice(i, j) From 6447e4c6c561fab2b249f2323dc368c0da13c97a Mon Sep 17 00:00:00 2001 From: Joris Van den Bossche Date: Tue, 1 Nov 2016 17:08:56 +0100 Subject: [PATCH 2/3] catch error if loc is a slice (partial indexing) --- pandas/indexes/multi.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/pandas/indexes/multi.py b/pandas/indexes/multi.py index 356fca0ba6de6..f9576d92d8a49 100644 --- a/pandas/indexes/multi.py +++ b/pandas/indexes/multi.py @@ -1907,7 +1907,13 @@ def convert_indexer(start, stop, step, indexer=indexer, labels=labels): return np.array(labels == loc, dtype=bool) else: # sorted, so can return slice object -> view - loc = labels.dtype.type(loc) + try: + loc = labels.dtype.type(loc) + except TypeError: + # this occurs when loc is a slice (partial string indexing) + # but the TypeError raised by searchsorted in this case + # is catched in Index._has_valid_type() + pass i = labels.searchsorted(loc, side='left') j = labels.searchsorted(loc, side='right') return slice(i, j) From 700afa509b33659ec23fad98fa8837862e127e6f Mon Sep 17 00:00:00 2001 From: Joris Van den Bossche Date: Wed, 2 Nov 2016 16:15:05 +0100 Subject: [PATCH 3/3] add whatsnew notice --- doc/source/whatsnew/v0.19.1.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/whatsnew/v0.19.1.txt b/doc/source/whatsnew/v0.19.1.txt index a81ab6ed0311c..eda67bc7088f2 100644 --- a/doc/source/whatsnew/v0.19.1.txt +++ b/doc/source/whatsnew/v0.19.1.txt @@ -24,7 +24,7 @@ Performance Improvements - Improved performance in ``.to_json()`` when ``lines=True`` (:issue:`14408`) - Improved performance in ``Series.asof(where)`` when ``where`` is a scalar (:issue:`14461) - Improved performance in ``DataFrame.asof(where)`` when ``where`` is a scalar (:issue:`14461) - +- Improved performance in certain types of `loc` indexing with a MultiIndex (:issue:`14551`).