Performs lexical sorting on a set of keys Parameters ---------- keys : Sequence[ArrayLike | Index | Series] Sequence of arrays to be sorted by the indexer Sequence[Series] is only if key is not None. orders : bool or list of booleans, optional Determines
(
keys: Sequence[ArrayLike | Index | Series],
orders=None,
na_position: str = "last",
key: Callable | None = None,
codes_given: bool = False,
)
| 300 | |
| 301 | |
| 302 | def lexsort_indexer( |
| 303 | keys: Sequence[ArrayLike | Index | Series], |
| 304 | orders=None, |
| 305 | na_position: str = "last", |
| 306 | key: Callable | None = None, |
| 307 | codes_given: bool = False, |
| 308 | ) -> npt.NDArray[np.intp]: |
| 309 | """ |
| 310 | Performs lexical sorting on a set of keys |
| 311 | |
| 312 | Parameters |
| 313 | ---------- |
| 314 | keys : Sequence[ArrayLike | Index | Series] |
| 315 | Sequence of arrays to be sorted by the indexer |
| 316 | Sequence[Series] is only if key is not None. |
| 317 | orders : bool or list of booleans, optional |
| 318 | Determines the sorting order for each element in keys. If a list, |
| 319 | it must be the same length as keys. This determines whether the |
| 320 | corresponding element in keys should be sorted in ascending |
| 321 | (True) or descending (False) order. if bool, applied to all |
| 322 | elements as above. if None, defaults to True. |
| 323 | na_position : {'first', 'last'}, default 'last' |
| 324 | Determines placement of NA elements in the sorted list ("last" or "first") |
| 325 | key : Callable, optional |
| 326 | Callable key function applied to every element in keys before sorting |
| 327 | codes_given: bool, False |
| 328 | Avoid categorical materialization if codes are already provided. |
| 329 | |
| 330 | Returns |
| 331 | ------- |
| 332 | np.ndarray[np.intp] |
| 333 | """ |
| 334 | from pandas.core.arrays import Categorical |
| 335 | |
| 336 | if na_position not in ["last", "first"]: |
| 337 | raise ValueError(f"invalid na_position: {na_position}") |
| 338 | |
| 339 | if isinstance(orders, bool): |
| 340 | orders = itertools.repeat(orders, len(keys)) |
| 341 | elif orders is None: |
| 342 | orders = itertools.repeat(True, len(keys)) |
| 343 | else: |
| 344 | orders = reversed(orders) |
| 345 | |
| 346 | labels = [] |
| 347 | |
| 348 | for k, order in zip(reversed(keys), orders, strict=True): |
| 349 | k = ensure_key_mapped(k, key) |
| 350 | if codes_given: |
| 351 | codes = cast(np.ndarray, k) |
| 352 | n = codes.max() + 1 if len(codes) else 0 |
| 353 | else: |
| 354 | cat = Categorical(k, ordered=True) |
| 355 | codes = cat.codes |
| 356 | n = len(cat.categories) |
| 357 | |
| 358 | mask = codes == -1 |
| 359 |