Create a new index with target's values (move/add/delete values as necessary) use with non-unique Index and a possibly non-unique target. Parameters ---------- target : an iterable Returns ------- new_index : pd.Index Res
(
self, target: Index
)
| 4269 | |
| 4270 | @final |
| 4271 | def _reindex_non_unique( |
| 4272 | self, target: Index |
| 4273 | ) -> tuple[Index, npt.NDArray[np.intp], npt.NDArray[np.intp] | None]: |
| 4274 | """ |
| 4275 | Create a new index with target's values (move/add/delete values as |
| 4276 | necessary) use with non-unique Index and a possibly non-unique target. |
| 4277 | |
| 4278 | Parameters |
| 4279 | ---------- |
| 4280 | target : an iterable |
| 4281 | |
| 4282 | Returns |
| 4283 | ------- |
| 4284 | new_index : pd.Index |
| 4285 | Resulting index. |
| 4286 | indexer : np.ndarray[np.intp] |
| 4287 | Indices of output values in original index. |
| 4288 | new_indexer : np.ndarray[np.intp] or None |
| 4289 | |
| 4290 | """ |
| 4291 | target = ensure_index(target) |
| 4292 | if len(target) == 0: |
| 4293 | # GH#13691 |
| 4294 | return self[:0], np.array([], dtype=np.intp), None |
| 4295 | |
| 4296 | indexer, missing = self.get_indexer_non_unique(target) |
| 4297 | check = indexer != -1 |
| 4298 | new_labels: Index | np.ndarray = self.take(indexer[check]) |
| 4299 | new_indexer = None |
| 4300 | |
| 4301 | if len(missing): |
| 4302 | length = np.arange(len(indexer), dtype=np.intp) |
| 4303 | |
| 4304 | missing = ensure_platform_int(missing) |
| 4305 | missing_labels = target.take(missing) |
| 4306 | missing_indexer = length[~check] |
| 4307 | cur_labels = self.take(indexer[check]).values |
| 4308 | cur_indexer = length[check] |
| 4309 | |
| 4310 | # Index constructor below will do inference |
| 4311 | new_labels = np.empty((len(indexer),), dtype=object) |
| 4312 | new_labels[cur_indexer] = cur_labels |
| 4313 | new_labels[missing_indexer] = missing_labels |
| 4314 | |
| 4315 | # GH#38906 |
| 4316 | if not len(self): |
| 4317 | new_indexer = np.arange(0, dtype=np.intp) |
| 4318 | |
| 4319 | # a unique indexer |
| 4320 | elif target.is_unique: |
| 4321 | # see GH5553, make sure we use the right indexer |
| 4322 | new_indexer = np.arange(len(indexer), dtype=np.intp) |
| 4323 | new_indexer[cur_indexer] = np.arange(len(cur_labels)) |
| 4324 | new_indexer[missing_indexer] = -1 |
| 4325 | |
| 4326 | # we have a non_unique selector, need to use the original |
| 4327 | # indexer here |
| 4328 | else: |
no test coverage detected