Skip to content

Commit 3787bac

Browse files
jbrockmendelyeshsurya
authored andcommitted
TYP: Index.reindex (pandas-dev#40950)
1 parent fa729e8 commit 3787bac

File tree

3 files changed

+35
-17
lines changed

3 files changed

+35
-17
lines changed

pandas/core/indexes/base.py

+12-7
Original file line numberDiff line numberDiff line change
@@ -3762,7 +3762,9 @@ def _validate_can_reindex(self, indexer: np.ndarray) -> None:
37623762
if not self._index_as_unique and len(indexer):
37633763
raise ValueError("cannot reindex from a duplicate axis")
37643764

3765-
def reindex(self, target, method=None, level=None, limit=None, tolerance=None):
3765+
def reindex(
3766+
self, target, method=None, level=None, limit=None, tolerance=None
3767+
) -> tuple[Index, np.ndarray | None]:
37663768
"""
37673769
Create index with target's values.
37683770
@@ -3774,7 +3776,7 @@ def reindex(self, target, method=None, level=None, limit=None, tolerance=None):
37743776
-------
37753777
new_index : pd.Index
37763778
Resulting index.
3777-
indexer : np.ndarray or None
3779+
indexer : np.ndarray[np.intp] or None
37783780
Indices of output values in original index.
37793781
"""
37803782
# GH6552: preserve names when reindexing to non-named target
@@ -3815,7 +3817,9 @@ def reindex(self, target, method=None, level=None, limit=None, tolerance=None):
38153817

38163818
return target, indexer
38173819

3818-
def _reindex_non_unique(self, target):
3820+
def _reindex_non_unique(
3821+
self, target: Index
3822+
) -> tuple[Index, np.ndarray, np.ndarray | None]:
38193823
"""
38203824
Create a new index with target's values (move/add/delete values as
38213825
necessary) use with non-unique Index and a possibly non-unique target.
@@ -3828,8 +3832,9 @@ def _reindex_non_unique(self, target):
38283832
-------
38293833
new_index : pd.Index
38303834
Resulting index.
3831-
indexer : np.ndarray or None
3835+
indexer : np.ndarray[np.intp]
38323836
Indices of output values in original index.
3837+
new_indexer : np.ndarray[np.intp] or None
38333838
38343839
"""
38353840
target = ensure_index(target)
@@ -3858,13 +3863,13 @@ def _reindex_non_unique(self, target):
38583863
# GH#38906
38593864
if not len(self):
38603865

3861-
new_indexer = np.arange(0)
3866+
new_indexer = np.arange(0, dtype=np.intp)
38623867

38633868
# a unique indexer
38643869
elif target.is_unique:
38653870

38663871
# see GH5553, make sure we use the right indexer
3867-
new_indexer = np.arange(len(indexer))
3872+
new_indexer = np.arange(len(indexer), dtype=np.intp)
38683873
new_indexer[cur_indexer] = np.arange(len(cur_labels))
38693874
new_indexer[missing_indexer] = -1
38703875

@@ -3876,7 +3881,7 @@ def _reindex_non_unique(self, target):
38763881
indexer[~check] = -1
38773882

38783883
# reset the new indexer to account for the new size
3879-
new_indexer = np.arange(len(self.take(indexer)))
3884+
new_indexer = np.arange(len(self.take(indexer)), dtype=np.intp)
38803885
new_indexer[~check] = -1
38813886

38823887
if isinstance(self, ABCMultiIndex):

pandas/core/indexes/category.py

+19-8
Original file line numberDiff line numberDiff line change
@@ -395,15 +395,17 @@ def unique(self, level=None):
395395
# of result, not self.
396396
return type(self)._simple_new(result, name=self.name)
397397

398-
def reindex(self, target, method=None, level=None, limit=None, tolerance=None):
398+
def reindex(
399+
self, target, method=None, level=None, limit=None, tolerance=None
400+
) -> tuple[Index, np.ndarray | None]:
399401
"""
400402
Create index with target's values (move/add/delete values as necessary)
401403
402404
Returns
403405
-------
404406
new_index : pd.Index
405407
Resulting index
406-
indexer : np.ndarray or None
408+
indexer : np.ndarray[np.intp] or None
407409
Indices of output values in original index
408410
409411
"""
@@ -440,7 +442,7 @@ def reindex(self, target, method=None, level=None, limit=None, tolerance=None):
440442
if not isinstance(cats, CategoricalIndex) or (cats == -1).any():
441443
# coerce to a regular index here!
442444
result = Index(np.array(self), name=self.name)
443-
new_target, indexer, _ = result._reindex_non_unique(np.array(target))
445+
new_target, indexer, _ = result._reindex_non_unique(target)
444446
else:
445447

446448
codes = new_target.codes.copy()
@@ -462,25 +464,34 @@ def reindex(self, target, method=None, level=None, limit=None, tolerance=None):
462464

463465
return new_target, indexer
464466

465-
def _reindex_non_unique(self, target):
467+
# error: Return type "Tuple[Index, Optional[ndarray], Optional[ndarray]]"
468+
# of "_reindex_non_unique" incompatible with return type
469+
# "Tuple[Index, ndarray, Optional[ndarray]]" in supertype "Index"
470+
def _reindex_non_unique( # type: ignore[override]
471+
self, target: Index
472+
) -> tuple[Index, np.ndarray | None, np.ndarray | None]:
466473
"""
467474
reindex from a non-unique; which CategoricalIndex's are almost
468475
always
469476
"""
477+
# TODO: rule out `indexer is None` here to make the signature
478+
# match the parent class's signature. This should be equivalent
479+
# to ruling out `self.equals(target)`
470480
new_target, indexer = self.reindex(target)
471481
new_indexer = None
472482

473483
check = indexer == -1
474-
if check.any():
475-
new_indexer = np.arange(len(self.take(indexer)))
484+
# error: Item "bool" of "Union[Any, bool]" has no attribute "any"
485+
if check.any(): # type: ignore[union-attr]
486+
new_indexer = np.arange(len(self.take(indexer)), dtype=np.intp)
476487
new_indexer[check] = -1
477488

478489
cats = self.categories.get_indexer(target)
479490
if not (cats == -1).any():
480491
# .reindex returns normal Index. Revert to CategoricalIndex if
481492
# all targets are included in my categories
482-
new_target = Categorical(new_target, dtype=self.dtype)
483-
new_target = type(self)._simple_new(new_target, name=self.name)
493+
cat = Categorical(new_target, dtype=self.dtype)
494+
new_target = type(self)._simple_new(cat, name=self.name)
484495

485496
return new_target, indexer, new_indexer
486497

pandas/core/indexes/multi.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -2503,15 +2503,17 @@ def sortlevel(
25032503

25042504
return new_index, indexer
25052505

2506-
def reindex(self, target, method=None, level=None, limit=None, tolerance=None):
2506+
def reindex(
2507+
self, target, method=None, level=None, limit=None, tolerance=None
2508+
) -> tuple[MultiIndex, np.ndarray | None]:
25072509
"""
25082510
Create index with target's values (move/add/delete values as necessary)
25092511
25102512
Returns
25112513
-------
25122514
new_index : pd.MultiIndex
25132515
Resulting index
2514-
indexer : np.ndarray or None
2516+
indexer : np.ndarray[np.intp] or None
25152517
Indices of output values in original index.
25162518
25172519
"""

0 commit comments

Comments
 (0)