html_url,issue_url,id,node_id,user,created_at,updated_at,author_association,body,reactions,performed_via_github_app,issue
https://github.com/pydata/xarray/issues/6377#issuecomment-1084277555,https://api.github.com/repos/pydata/xarray/issues/6377,1084277555,IC_kwDOAMm_X85AoMMz,13662783,2022-03-31T08:45:18Z,2022-03-31T08:45:18Z,CONTRIBUTOR,"@Jeitan
The coordinate is a DataArray as well, so the following would work:
```python
# Example DataArray
da = xr.DataArray(np.ones((3, 3)), {""y"": [50.0, 60.0, 70.0], ""x"": [1.0, 2.0, 3.0]}, (""y"", ""x""))
# Replace 50.0 and 60.0 by 5.0 and 6.0 in the y coordinate
da[""y""] = da[""y""].replace_values([50.0, 60.0], [5.0, 6.0])
```
Your example in the other issue mentions one of the ways you'd replace in pandas, but for a dataframe. With a dataframe, there's quite some flexibility:
```python
df.replace({0: 10, 1: 100})
df.replace({'A': 0, 'B': 5}, 100)
df.replace({'A': {0: 100, 4: 400}})
```
I'd say the xarray counterpart of a Dataframe is a Dataset; the counterpart of a DataArray is a Series.
Replacing the coordinates in a DataArray is akin to replacing the values of the index of a Series, which is apparently possible with `series.rename(index={from: to})`.
Other thoughts: some complexity comes in when implementing a `replace_values` method for a Dataset.
I also think the pandas `replace` method signature is too complicated (scalars, lists, dicts, dicts of dicts, probably more?) and the docstring is quite extensive (https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.replace.html)
I think the question is what the signature should be. You could compare to reindex (https://xarray.pydata.org/en/stable/generated/xarray.Dataset.reindex.html) and have an ""replacer"" argument:
```python
da = da.replace({""y"": ([50.0, 60.0], [5.0, 6.0])})
da[""y""] = da[""y""].replace([50.0, 60.0], [5.0, 6.0])
```
The first one would also work for Datasets, but I personally prefer the second one for it's simplicity (and which is maybe closer to `.where` : https://xarray.pydata.org/en/stable/generated/xarray.DataArray.where.html).
","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,1173497454
https://github.com/pydata/xarray/issues/6377#issuecomment-1073776411,https://api.github.com/repos/pydata/xarray/issues/6377,1073776411,IC_kwDOAMm_X85AAIcb,13662783,2022-03-21T11:20:26Z,2022-03-21T11:30:53Z,CONTRIBUTOR,"Yeah I think maybe `replace_values` is better name. ""search and replace values"" is maybe how you'd describe it colloquially?`remap` is an option too, but I think many users won't have the right assocation with it (if they're coming from a less technical background).
I don't think you'd want to this with `np.select`. If I understand correctly, you'd have to broadcast for the number of values to replace. This work okay with a small number of replacement values, but not with 10 000 like in my example above (but my understanding might be lacking).
Having said that, there is a faster and much cleaner implementation using `np.seachsorted` on `da` instead.
```python
def custom_replace2(da, to_replace, value):
flat = da.values.ravel()
sorter = np.argsort(to_replace)
insertion = np.searchsorted(to_replace, flat, sorter=sorter)
indices = np.take(sorter, insertion, mode=""clip"")
replaceable = (to_replace[indices] == flat)
out = flat.copy()
out[replaceable] = value[indices[replaceable]]
return da.copy(data=out.reshape(da.shape))
# For small example: 4.1 ms ± 144 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
# For the larger example: # 14.4 ms ± 592 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit custom_replace2(da, to_replace, value)
```
This is equal to the implementation of `remap` in `numpy-indexed` (which is MIT-licensed):
https://github.com/EelcoHoogendoorn/Numpy_arraysetops_EP
The key trick is the same, relying on sorting.
See e.g. also: https://stackoverflow.com/questions/16992713/translate-every-element-in-numpy-array-according-to-key
","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,1173497454