Skip to content

Improve Dataset.map keep_attrs #11719

Open

Description

@headtr1ck

What is your issue?

Follow-up to #11020 / #11019.

Since #10726 (v2025.11.0) Dataset.map has no way to keep attributes set by the mapped function: keep_attrs=True overwrites them with the original attrs, keep_attrs=False drops them. #11020 fixes this regression by leaving the function's attrs alone for keep_attrs=False and merging with drop_conflicts for keep_attrs=True. The discussion there showed that the boolean keep_attrs is the wrong interface for map:

  • The function receives xarray objects, so it can handle attrs itself. keep_attrs mainly gets in the way of that (@dcherian, @max-sixty).
  • Coordinates can still be modified inside the function, so the coordinate attrs of the results need to be combined somehow. That is what the argument should control instead, e.g. as combine_attrs (@jsignell, @dcherian).
  • A boolean keep_attrs is ambiguous: does False mean "drop the input attrs" or "drop all attrs on the output"? (@keewis, @jsignell; see also Change behavior of keep_attrs in xr.where when x is a scalar #10997)
  • map is basically a loop over .data_vars, and users who need full control can do that loop themselves, e.g. ds.assign({name: func(var) for name, var in ds.data_vars.items()}) or xr.merge(..., combine_attrs=...) (@keewis, @jsignell).
  • Before deprecating keep_attrs, users need a way to opt into the new behavior (@keewis, @jsignell).

Options discussed for that:

  1. Add combine_attrs to map, accepting the usual strategy names / a callable, and deprecate keep_attrs. This is the option @keewis and @jsignell leaned towards.
  2. Let keep_attrs accept strategy names / a callable, like apply_ufunc, mapping True to "override" and False to "drop". This avoids a new argument, but a single value can't then control data variable and coordinate attrs separately.
  3. Remove keep_attrs from map without replacement and keep whatever attrs the function returns.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions