Skip to content

Commit 6cbac2e

Browse files
PERF: improve iloc list indexing
1 parent b94186d commit 6cbac2e

File tree

3 files changed

+19
-14
lines changed

3 files changed

+19
-14
lines changed

pandas/core/indexing.py

+16-11
Original file line numberDiff line numberDiff line change
@@ -1711,34 +1711,38 @@ def _get_slice_axis(self, slice_obj, axis=0):
17111711
else:
17121712
return self.obj.take(slice_obj, axis=axis, convert=False)
17131713

1714-
def _get_list_axis(self, key_list, axis=0):
1714+
def _get_list_axis(self, key, axis=0):
17151715
"""
1716-
Return Series values by list or array of integers
1716+
Return Series values by array of integers
17171717
17181718
Parameters
17191719
----------
1720-
key_list : list-like positional indexer
1720+
key : list-like positional indexer (already converted to array)
17211721
axis : int (can only be zero)
17221722
17231723
Returns
17241724
-------
17251725
Series object
17261726
"""
1727-
1728-
# validate list bounds
1729-
self._is_valid_list_like(key_list, axis)
1730-
1731-
# force an actual list
1732-
key_list = list(key_list)
1733-
return self.obj.take(key_list, axis=axis, convert=False)
1727+
try:
1728+
return self.obj.take(key, axis=axis, convert=False)
1729+
except IndexError:
1730+
# re-raise with different error message
1731+
raise IndexError("positional indexers are out-of-bounds")
17341732

17351733
def _getitem_axis(self, key, axis=0):
17361734

17371735
if isinstance(key, slice):
17381736
self._has_valid_type(key, axis)
17391737
return self._get_slice_axis(key, axis=axis)
17401738

1741-
elif is_bool_indexer(key):
1739+
if isinstance(key, list):
1740+
try:
1741+
key = np.asarray(key)
1742+
except TypeError: # pragma: no cover
1743+
pass
1744+
1745+
if is_bool_indexer(key):
17421746
self._has_valid_type(key, axis)
17431747
return self._getbool_axis(key, axis=axis)
17441748

@@ -1748,6 +1752,7 @@ def _getitem_axis(self, key, axis=0):
17481752

17491753
# a single integer
17501754
else:
1755+
17511756
key = self._convert_scalar_indexer(key, axis)
17521757

17531758
if not is_integer(key):

pandas/core/series.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -2437,7 +2437,7 @@ def take(self, indices, axis=0, convert=True, is_copy=False, **kwargs):
24372437
--------
24382438
numpy.ndarray.take
24392439
"""
2440-
nv.validate_take(tuple(), kwargs)
2440+
#nv.validate_take(tuple(), kwargs)
24412441

24422442
# check/convert indicies here
24432443
if convert:
@@ -2447,7 +2447,7 @@ def take(self, indices, axis=0, convert=True, is_copy=False, **kwargs):
24472447
new_index = self.index.take(indices)
24482448
new_values = self._values.take(indices)
24492449
return self._constructor(new_values,
2450-
index=new_index).__finalize__(self)
2450+
index=new_index, fastpath=True).__finalize__(self)
24512451

24522452
def isin(self, values):
24532453
"""

pandas/indexes/base.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1610,7 +1610,7 @@ def _append_same_dtype(self, to_concat, name):
16101610
@Appender(_index_shared_docs['take'] % _index_doc_kwargs)
16111611
def take(self, indices, axis=0, allow_fill=True,
16121612
fill_value=None, **kwargs):
1613-
nv.validate_take(tuple(), kwargs)
1613+
#nv.validate_take(tuple(), kwargs)
16141614
indices = _ensure_platform_int(indices)
16151615
if self._can_hold_na:
16161616
taken = self._assert_take_fillable(self.values, indices,

0 commit comments

Comments
 (0)