-
-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Description
From #4108:
I wonder if it would be better to first "reorganize" all of the existing functions: we currently have rename (and Dataset.rename_dims / Dataset.rename_vars), set_coords, reset_coords, set_index, reset_index and swap_dims, which overlap partially. For example, the code sample from #4417 works if instead of
ds = ds.rename(b='x')
ds = ds.set_coords('x')we use
ds = ds.set_index(x="b")and something similar for the code sample in #4107.
I believe we currently have these use cases (not sure if that list is complete, though):
- rename a
DataArray→rename - rename a existing variable to a name that is not yet in the object →
rename/Dataset.rename_vars/Dataset.rename_dims - convert a data variable to a coordinate (not a dimension coordinate) →
set_coords - convert a coordinate (not a dimension coordinate) to a data variable →
reset_coords - swap a existing dimension coordinate with a coordinate (which may not exist) and rename the dimension →
swap_dims - use a existing coordinate / data variable as a dimension coordinate (do not rename the dimension) →
set_index - stop using a coordinate as dimension coordinate and append
_to its name (do not rename the dimension) →reset_index - use two existing coordinates / data variables as a MultiIndex →
set_index - stop using a MultiIndex as a dimension coordinate and use its levels as coordinates →
reset_index
Sometimes, some of these can be emulated by combinations of others, for example:
# x is a dimension without coordinates
assert_identical(ds.set_index({"x": "b"}), ds.swap_dims({"x": "b"}).rename({"b": "x"}))
assert_identical(ds.swap_dims({"x": "b"}), ds.set_index({"x": "b"}).rename({"x": "b"}))and, with this PR:
assert_identical(ds.set_index({"x": "b"}), ds.set_coords("b").rename({"b": "x"}))
assert_identical(ds.swap_dims({"x": "b"}), ds.rename({"b": "x"}))which means that it would increase the overlap of rename, set_index, and swap_dims.
In any case I think we should add a guide which explains which method to pick in which situation (or extend howdoi).
Originally posted by @keewis in #4108 (comment)