Rearrange index levels using input order. Parameters ---------- dim_order : dict-like of Hashable to Sequence of int or Hashable, optional Mapping from names matching dimensions and values given by lists representing new level orders. Every given dime
(
self,
dim_order: Mapping[Any, Sequence[int | Hashable]] | None = None,
**dim_order_kwargs: Sequence[int | Hashable],
)
| 5116 | ) |
| 5117 | |
| 5118 | def reorder_levels( |
| 5119 | self, |
| 5120 | dim_order: Mapping[Any, Sequence[int | Hashable]] | None = None, |
| 5121 | **dim_order_kwargs: Sequence[int | Hashable], |
| 5122 | ) -> Self: |
| 5123 | """Rearrange index levels using input order. |
| 5124 | |
| 5125 | Parameters |
| 5126 | ---------- |
| 5127 | dim_order : dict-like of Hashable to Sequence of int or Hashable, optional |
| 5128 | Mapping from names matching dimensions and values given |
| 5129 | by lists representing new level orders. Every given dimension |
| 5130 | must have a multi-index. |
| 5131 | **dim_order_kwargs : Sequence of int or Hashable, optional |
| 5132 | The keyword arguments form of ``dim_order``. |
| 5133 | One of dim_order or dim_order_kwargs must be provided. |
| 5134 | |
| 5135 | Returns |
| 5136 | ------- |
| 5137 | obj : Dataset |
| 5138 | Another dataset, with this dataset's data but replaced |
| 5139 | coordinates. |
| 5140 | """ |
| 5141 | dim_order = either_dict_or_kwargs(dim_order, dim_order_kwargs, "reorder_levels") |
| 5142 | variables = self._variables.copy() |
| 5143 | indexes = dict(self._indexes) |
| 5144 | new_indexes: dict[Hashable, Index] = {} |
| 5145 | new_variables: dict[Hashable, IndexVariable] = {} |
| 5146 | |
| 5147 | for dim, order in dim_order.items(): |
| 5148 | index = self._indexes[dim] |
| 5149 | |
| 5150 | if not isinstance(index, PandasMultiIndex): |
| 5151 | raise ValueError(f"coordinate {dim} has no MultiIndex") |
| 5152 | |
| 5153 | level_vars = {k: self._variables[k] for k in order} |
| 5154 | idx = index.reorder_levels(level_vars) |
| 5155 | idx_vars = idx.create_variables(level_vars) |
| 5156 | new_indexes.update(dict.fromkeys(idx_vars, idx)) |
| 5157 | new_variables.update(idx_vars) |
| 5158 | |
| 5159 | indexes = {k: v for k, v in self._indexes.items() if k not in new_indexes} |
| 5160 | indexes.update(new_indexes) |
| 5161 | |
| 5162 | variables = {k: v for k, v in self._variables.items() if k not in new_variables} |
| 5163 | variables.update(new_variables) |
| 5164 | |
| 5165 | return self._replace(variables, indexes=indexes) |
| 5166 | |
| 5167 | def _get_stack_index( |
| 5168 | self, |