Make a MultiIndex from the cartesian product of multiple iterables. Parameters ---------- iterables : list / sequence of iterables Each iterable has unique labels for each level of the index. sortorder : int or None Level of sortednes
(
cls,
iterables: Sequence[Iterable[Hashable]],
sortorder: int | None = None,
names: Sequence[Hashable] | Hashable | lib.NoDefault = lib.no_default,
)
| 592 | |
| 593 | @classmethod |
| 594 | def from_product( |
| 595 | cls, |
| 596 | iterables: Sequence[Iterable[Hashable]], |
| 597 | sortorder: int | None = None, |
| 598 | names: Sequence[Hashable] | Hashable | lib.NoDefault = lib.no_default, |
| 599 | ) -> MultiIndex: |
| 600 | """ |
| 601 | Make a MultiIndex from the cartesian product of multiple iterables. |
| 602 | |
| 603 | Parameters |
| 604 | ---------- |
| 605 | iterables : list / sequence of iterables |
| 606 | Each iterable has unique labels for each level of the index. |
| 607 | sortorder : int or None |
| 608 | Level of sortedness (must be lexicographically sorted by that |
| 609 | level). |
| 610 | names : list / sequence of str, optional |
| 611 | Names for the levels in the index. |
| 612 | If not explicitly provided, names will be inferred from the |
| 613 | elements of iterables if an element has a name attribute. |
| 614 | |
| 615 | Returns |
| 616 | ------- |
| 617 | MultiIndex |
| 618 | |
| 619 | See Also |
| 620 | -------- |
| 621 | MultiIndex.from_arrays : Convert list of arrays to MultiIndex. |
| 622 | MultiIndex.from_tuples : Convert list of tuples to MultiIndex. |
| 623 | MultiIndex.from_frame : Make a MultiIndex from a DataFrame. |
| 624 | |
| 625 | Examples |
| 626 | -------- |
| 627 | >>> numbers = [0, 1, 2] |
| 628 | >>> colors = ["green", "purple"] |
| 629 | >>> pd.MultiIndex.from_product([numbers, colors], names=["number", "color"]) |
| 630 | MultiIndex([(0, 'green'), |
| 631 | (0, 'purple'), |
| 632 | (1, 'green'), |
| 633 | (1, 'purple'), |
| 634 | (2, 'green'), |
| 635 | (2, 'purple')], |
| 636 | names=['number', 'color']) |
| 637 | """ |
| 638 | |
| 639 | if not is_list_like(iterables): |
| 640 | raise TypeError("Input must be a list / sequence of iterables.") |
| 641 | if is_iterator(iterables): |
| 642 | iterables = list(iterables) |
| 643 | |
| 644 | codes, levels = factorize_from_iterables(iterables) |
| 645 | if names is lib.no_default: |
| 646 | names = [getattr(it, "name", None) for it in iterables] |
| 647 | |
| 648 | # codes are all ndarrays, so cartesian_product is lossless |
| 649 | codes = cartesian_product(codes) |
| 650 | return cls(levels, codes, sortorder=sortorder, names=names) |
| 651 |