加入类似于 Pandas 的 XArray

join in XArray akin to Pandas

xarray 是否意味着避免传统的 table 加入而 Pandas 很容易做到,或者我只是不明白?这是一个简单的示例,其中包含一个 "left" 数据集 (ds) 和一个 "right" 数据集 (other),我想在左连接中合并它们:

import xarray as xr

ds = xr.Dataset({"a": ("index", list("xyzxyzxy"))})
other = xr.Dataset({"a": list("xz"), "b": ("a", [1, 2])})

在尝试 ds.merge(other) 时,xarray 提示它需要更多信息,但我如何告诉它 "a" 不应该是结果中的坐标?

MergeError: unable to determine if these variables should be coordinates or not in the merged result: {'a'}

期望的结果是我通过 Pandas:

转移的结果
>>> ds = ds.to_dataframe()
>>> other = other.to_dataframe()
>>> ds.join(other, on="a").to_xarray()
<xarray.Dataset>
Dimensions:  (index: 8)
Coordinates:
  * index    (index) int64 0 1 2 3 4 5 6 7
Data variables:
    a        (index) object 'x' 'y' 'z' 'x' 'y' 'z' 'x' 'y'
    b        (index) float64 1.0 nan 2.0 1.0 nan 2.0 1.0 nan

未接受的答案

>>> ds.set_coords("a").merge(other)
<xarray.Dataset>
Dimensions:  (a: 2)
Coordinates:
  * a        (a) <U1 'x' 'z'
Data variables:
    b        (a) int64 1 2
>>> ds.set_coords("a").merge(other, join="left")
<xarray.Dataset>
Dimensions:  (a: 2)
Coordinates:
  * a        (a) <U1 'x' 'z'
Data variables:
    b        (a) int64 1 2

aother中是坐标变量,在ds中是数据变量。

>>> ds

<xarray.Dataset>
Dimensions:  (index: 8)
Dimensions without coordinates: index
Data variables:
    a        (index) <U1 'x' 'y' 'z' 'x' 'y' 'z' 'x' 'y'

>>> other

<xarray.Dataset>
Dimensions:  (a: 2)
Coordinates:
  * a        (a) <U1 'x' 'z'
Data variables:
    b        (a) int64 1 2

解决方法是明确地使a成为ds中的一个坐标变量。我们应该更新错误消息以建议此解决方案

>>> ds.set_coords("a").merge(other)

<xarray.Dataset>
Dimensions:  (a: 2)
Coordinates:
  * a        (a) <U1 'x' 'z'
Data variables:
    b        (a) int64 1 2

Does xarray mean to avoid traditional table joins that Pandas does easily, or am I just not getting it?

使用 Pandas 似乎是目前唯一的方法。不清楚 xarray 是否计划不实现这种连接。

用户dcherian可以按照此处的详细说明实现多对一合并:https://github.com/pydata/xarray/issues/4766#issuecomment-754780927

不过我认为他的回答有一点错字——我用的是 z.sel(y=y, drop=True) 而不是 z.sel(x=y, drop=True)