Given an index, find the level length for each element. Parameters ---------- index : Index Index or columns to determine lengths of each element sparsify : bool Whether to hide or show each distinct element in a MultiIndex max_index : int The maximu
(
index: Index,
sparsify: bool,
max_index: int,
hidden_elements: Sequence[int] | None = None,
)
| 1781 | |
| 1782 | |
| 1783 | def _get_level_lengths( |
| 1784 | index: Index, |
| 1785 | sparsify: bool, |
| 1786 | max_index: int, |
| 1787 | hidden_elements: Sequence[int] | None = None, |
| 1788 | ): |
| 1789 | """ |
| 1790 | Given an index, find the level length for each element. |
| 1791 | |
| 1792 | Parameters |
| 1793 | ---------- |
| 1794 | index : Index |
| 1795 | Index or columns to determine lengths of each element |
| 1796 | sparsify : bool |
| 1797 | Whether to hide or show each distinct element in a MultiIndex |
| 1798 | max_index : int |
| 1799 | The maximum number of elements to analyse along the index due to trimming |
| 1800 | hidden_elements : sequence of int |
| 1801 | Index positions of elements hidden from display in the index affecting |
| 1802 | length |
| 1803 | |
| 1804 | Returns |
| 1805 | ------- |
| 1806 | Dict : |
| 1807 | Result is a dictionary of (level, initial_position): span |
| 1808 | """ |
| 1809 | if isinstance(index, MultiIndex): |
| 1810 | levels = index._format_multi(sparsify=lib.no_default, include_names=False) |
| 1811 | else: |
| 1812 | levels = index._format_flat(include_name=False) |
| 1813 | |
| 1814 | if hidden_elements is None: |
| 1815 | hidden_elements = [] |
| 1816 | |
| 1817 | lengths = {} |
| 1818 | if not isinstance(index, MultiIndex): |
| 1819 | for i, value in enumerate(levels): |
| 1820 | if i not in hidden_elements: |
| 1821 | lengths[(0, i)] = 1 |
| 1822 | return lengths |
| 1823 | |
| 1824 | for i, lvl in enumerate(levels): |
| 1825 | visible_row_count = 0 # used to break loop due to display trimming |
| 1826 | for j, row in enumerate(lvl): |
| 1827 | if visible_row_count > max_index: |
| 1828 | break |
| 1829 | if not sparsify: |
| 1830 | # then lengths will always equal 1 since no aggregation. |
| 1831 | if j not in hidden_elements: |
| 1832 | lengths[(i, j)] = 1 |
| 1833 | visible_row_count += 1 |
| 1834 | elif (row is not lib.no_default) and (j not in hidden_elements): |
| 1835 | # this element has not been sparsified so must be the start of section |
| 1836 | last_label = j |
| 1837 | lengths[(i, last_label)] = 1 |
| 1838 | visible_row_count += 1 |
| 1839 | elif row is not lib.no_default: |
| 1840 | # even if the above is hidden, keep track of it in case length > 1 and |