Skip to content

Commit d4e8cb2

Browse files
committed
PERF: optimize iloc for unique case
1 parent 1a67a8f commit d4e8cb2

File tree

3 files changed

+16
-9
lines changed

3 files changed

+16
-9
lines changed

pandas/core/frame.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -1981,7 +1981,8 @@ def _ixs(self, i, axis=0, copy=False):
19811981
if isinstance(label, Index):
19821982

19831983
# a location index by definition
1984-
return self.reindex(label, takeable=True)
1984+
i = _maybe_convert_indices(i, len(self._get_axis(axis)))
1985+
return self.reindex(i, takeable=True)
19851986
else:
19861987
try:
19871988
new_values = self._data.fast_2d_xs(i, copy=copy)

pandas/core/index.py

+10-6
Original file line numberDiff line numberDiff line change
@@ -938,27 +938,31 @@ def reindex(self, target, method=None, level=None, limit=None,
938938
_, indexer, _ = self._join_level(target, level, how='right',
939939
return_indexers=True)
940940
else:
941+
941942
if self.equals(target):
942943
indexer = None
943-
944+
944945
# to avoid aliasing an existing index
945946
if copy_if_needed and target.name != self.name and self.name is not None:
946947
if target.name is None:
947948
target = self.copy()
948949

949950
else:
951+
952+
if takeable:
953+
if method is not None or limit is not None:
954+
raise ValueError("cannot do a takeable reindex with "
955+
"with a method or limit")
956+
return self[target], target
957+
950958
if self.is_unique:
951959
indexer = self.get_indexer(target, method=method,
952960
limit=limit)
953961
else:
954962
if method is not None or limit is not None:
955963
raise ValueError("cannot reindex a non-unique index "
956964
"with a method or limit")
957-
if takeable:
958-
indexer = target
959-
missing = (target>=len(target)).nonzero()[0]
960-
else:
961-
indexer, missing = self.get_indexer_non_unique(target)
965+
indexer, _ = self.get_indexer_non_unique(target)
962966

963967
return target, indexer
964968

pandas/core/series.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@
2121
_NS_DTYPE, _TD_DTYPE)
2222
from pandas.core.index import (Index, MultiIndex, InvalidIndexError,
2323
_ensure_index, _handle_legacy_indexes)
24-
from pandas.core.indexing import _SeriesIndexer, _check_bool_indexer, _check_slice_bounds
24+
from pandas.core.indexing import (_SeriesIndexer, _check_bool_indexer,
25+
_check_slice_bounds, _maybe_convert_indices)
2526
from pandas.tseries.index import DatetimeIndex
2627
from pandas.tseries.period import PeriodIndex, Period
2728
from pandas.util import py3compat
@@ -598,7 +599,8 @@ def _ixs(self, i, axis=0):
598599
else:
599600
label = self.index[i]
600601
if isinstance(label, Index):
601-
return self.reindex(label, takeable=True)
602+
i = _maybe_convert_indices(i, len(self))
603+
return self.reindex(i, takeable=True)
602604
else:
603605
return _index.get_value_at(self, i)
604606

0 commit comments

Comments
 (0)