|
71 | 71 | propagate_indexes,
|
72 | 72 | remove_unused_levels_categories,
|
73 | 73 | roll_index,
|
74 |
| - wrap_pandas_index, |
75 | 74 | )
|
76 | 75 | from .indexing import is_fancy_indexer
|
77 | 76 | from .merge import (
|
@@ -1184,7 +1183,7 @@ def _overwrite_indexes(self, indexes: Mapping[Any, Index]) -> "Dataset":
|
1184 | 1183 | variables = self._variables.copy()
|
1185 | 1184 | new_indexes = dict(self.xindexes)
|
1186 | 1185 | for name, idx in indexes.items():
|
1187 |
| - variables[name] = IndexVariable(name, idx) |
| 1186 | + variables[name] = IndexVariable(name, idx.to_pandas_index()) |
1188 | 1187 | new_indexes[name] = idx
|
1189 | 1188 | obj = self._replace(variables, indexes=new_indexes)
|
1190 | 1189 |
|
@@ -2474,6 +2473,10 @@ def sel(
|
2474 | 2473 | pos_indexers, new_indexes = remap_label_indexers(
|
2475 | 2474 | self, indexers=indexers, method=method, tolerance=tolerance
|
2476 | 2475 | )
|
| 2476 | + # TODO: benbovy - flexible indexes: also use variables returned by Index.query |
| 2477 | + # (temporary dirty fix). |
| 2478 | + new_indexes = {k: v[0] for k, v in new_indexes.items()} |
| 2479 | + |
2477 | 2480 | result = self.isel(indexers=pos_indexers, drop=drop)
|
2478 | 2481 | return result._overwrite_indexes(new_indexes)
|
2479 | 2482 |
|
@@ -3297,20 +3300,21 @@ def _rename_dims(self, name_dict):
|
3297 | 3300 | return {name_dict.get(k, k): v for k, v in self.dims.items()}
|
3298 | 3301 |
|
3299 | 3302 | def _rename_indexes(self, name_dict, dims_set):
|
| 3303 | + # TODO: benbovy - flexible indexes: https://github.com/pydata/xarray/issues/5645 |
3300 | 3304 | if self._indexes is None:
|
3301 | 3305 | return None
|
3302 | 3306 | indexes = {}
|
3303 |
| - for k, v in self.xindexes.items(): |
3304 |
| - # TODO: benbovy - flexible indexes: make it compatible with any xarray Index |
3305 |
| - index = v.to_pandas_index() |
| 3307 | + for k, v in self.indexes.items(): |
3306 | 3308 | new_name = name_dict.get(k, k)
|
3307 | 3309 | if new_name not in dims_set:
|
3308 | 3310 | continue
|
3309 |
| - if isinstance(index, pd.MultiIndex): |
3310 |
| - new_names = [name_dict.get(k, k) for k in index.names] |
3311 |
| - indexes[new_name] = PandasMultiIndex(index.rename(names=new_names)) |
| 3311 | + if isinstance(v, pd.MultiIndex): |
| 3312 | + new_names = [name_dict.get(k, k) for k in v.names] |
| 3313 | + indexes[new_name] = PandasMultiIndex( |
| 3314 | + v.rename(names=new_names), new_name |
| 3315 | + ) |
3312 | 3316 | else:
|
3313 |
| - indexes[new_name] = PandasIndex(index.rename(new_name)) |
| 3317 | + indexes[new_name] = PandasIndex(v.rename(new_name), new_name) |
3314 | 3318 | return indexes
|
3315 | 3319 |
|
3316 | 3320 | def _rename_all(self, name_dict, dims_dict):
|
@@ -3539,7 +3543,10 @@ def swap_dims(
|
3539 | 3543 | if new_index.nlevels == 1:
|
3540 | 3544 | # make sure index name matches dimension name
|
3541 | 3545 | new_index = new_index.rename(k)
|
3542 |
| - indexes[k] = wrap_pandas_index(new_index) |
| 3546 | + if isinstance(new_index, pd.MultiIndex): |
| 3547 | + indexes[k] = PandasMultiIndex(new_index, k) |
| 3548 | + else: |
| 3549 | + indexes[k] = PandasIndex(new_index, k) |
3543 | 3550 | else:
|
3544 | 3551 | var = v.to_base_variable()
|
3545 | 3552 | var.dims = dims
|
@@ -3812,7 +3819,7 @@ def reorder_levels(
|
3812 | 3819 | raise ValueError(f"coordinate {dim} has no MultiIndex")
|
3813 | 3820 | new_index = index.reorder_levels(order)
|
3814 | 3821 | variables[dim] = IndexVariable(coord.dims, new_index)
|
3815 |
| - indexes[dim] = PandasMultiIndex(new_index) |
| 3822 | + indexes[dim] = PandasMultiIndex(new_index, dim) |
3816 | 3823 |
|
3817 | 3824 | return self._replace(variables, indexes=indexes)
|
3818 | 3825 |
|
@@ -3840,7 +3847,7 @@ def _stack_once(self, dims, new_dim):
|
3840 | 3847 | coord_names = set(self._coord_names) - set(dims) | {new_dim}
|
3841 | 3848 |
|
3842 | 3849 | indexes = {k: v for k, v in self.xindexes.items() if k not in dims}
|
3843 |
| - indexes[new_dim] = wrap_pandas_index(idx) |
| 3850 | + indexes[new_dim] = PandasMultiIndex(idx, new_dim) |
3844 | 3851 |
|
3845 | 3852 | return self._replace_with_new_dims(
|
3846 | 3853 | variables, coord_names=coord_names, indexes=indexes
|
@@ -4029,8 +4036,9 @@ def _unstack_once(self, dim: Hashable, fill_value) -> "Dataset":
|
4029 | 4036 | variables[name] = var
|
4030 | 4037 |
|
4031 | 4038 | for name, lev in zip(index.names, index.levels):
|
4032 |
| - variables[name] = IndexVariable(name, lev) |
4033 |
| - indexes[name] = PandasIndex(lev) |
| 4039 | + idx, idx_vars = PandasIndex.from_pandas_index(lev, name) |
| 4040 | + variables[name] = idx_vars[name] |
| 4041 | + indexes[name] = idx |
4034 | 4042 |
|
4035 | 4043 | coord_names = set(self._coord_names) - {dim} | set(index.names)
|
4036 | 4044 |
|
@@ -4068,8 +4076,9 @@ def _unstack_full_reindex(
|
4068 | 4076 | variables[name] = var
|
4069 | 4077 |
|
4070 | 4078 | for name, lev in zip(new_dim_names, index.levels):
|
4071 |
| - variables[name] = IndexVariable(name, lev) |
4072 |
| - indexes[name] = PandasIndex(lev) |
| 4079 | + idx, idx_vars = PandasIndex.from_pandas_index(lev, name) |
| 4080 | + variables[name] = idx_vars[name] |
| 4081 | + indexes[name] = idx |
4073 | 4082 |
|
4074 | 4083 | coord_names = set(self._coord_names) - {dim} | set(new_dim_names)
|
4075 | 4084 |
|
@@ -5839,10 +5848,13 @@ def diff(self, dim, n=1, label="upper"):
|
5839 | 5848 |
|
5840 | 5849 | indexes = dict(self.xindexes)
|
5841 | 5850 | if dim in indexes:
|
5842 |
| - # TODO: benbovy - flexible indexes: check slicing of xarray indexes? |
5843 |
| - # or only allow this for pandas indexes? |
5844 |
| - index = indexes[dim].to_pandas_index() |
5845 |
| - indexes[dim] = PandasIndex(index[kwargs_new[dim]]) |
| 5851 | + if isinstance(indexes[dim], PandasIndex): |
| 5852 | + # maybe optimize? (pandas index already indexed above with var.isel) |
| 5853 | + new_index = indexes[dim].index[kwargs_new[dim]] |
| 5854 | + if isinstance(new_index, pd.MultiIndex): |
| 5855 | + indexes[dim] = PandasMultiIndex(new_index, dim) |
| 5856 | + else: |
| 5857 | + indexes[dim] = PandasIndex(new_index, dim) |
5846 | 5858 |
|
5847 | 5859 | difference = self._replace_with_new_dims(variables, indexes=indexes)
|
5848 | 5860 |
|
|
0 commit comments