在xarray中过滤数据的简明方法

Max*_*ian 8 python python-xarray

我需要对xarray数组中的值应用一个非常简单的'match statement':

  1. 值> 0时,使2
  2. 值== 0时,设为0
  3. 价值在哪里NaN,制造NaN

这是我目前的解决方案.我正在使用NaNs ,, .fillna和类型强制来代替2d索引.

valid = date_by_items.notnull()
positive = date_by_items > 0
positive = positive * 2
result = positive.fillna(0.).where(valid)
result
Run Code Online (Sandbox Code Playgroud)

这改变了这个:

In [20]: date_by_items = xr.DataArray(np.asarray((list(range(3)) * 10)).reshape(6,5), dims=('date','item'))
    ...: date_by_items
    ...: 
Out[20]: 
<xarray.DataArray (date: 6, item: 5)>
array([[0, 1, 2, 0, 1],
       [2, 0, 1, 2, 0],
       [1, 2, 0, 1, 2],
       [0, 1, 2, 0, 1],
       [2, 0, 1, 2, 0],
       [1, 2, 0, 1, 2]])
Coordinates:
  * date     (date) int64 0 1 2 3 4 5
  * item     (item) int64 0 1 2 3 4
Run Code Online (Sandbox Code Playgroud)

......对此:

Out[22]: 
<xarray.DataArray (date: 6, item: 5)>
array([[ 0.,  2.,  2.,  0.,  2.],
       [ 2.,  0.,  2.,  2.,  0.],
       [ 2.,  2.,  0.,  2.,  2.],
       [ 0.,  2.,  2.,  0.,  2.],
       [ 2.,  0.,  2.,  2.,  0.],
       [ 2.,  2.,  0.,  2.,  2.]])
Coordinates:
  * date     (date) int64 0 1 2 3 4 5
  * item     (item) int64 0 1 2 3 4
Run Code Online (Sandbox Code Playgroud)

虽然在熊猫中df[df>0] = 2就足够了.当然,我正在做一些行人,而且还有一种方式吗?

Max*_*ian 7

xarray现在支持.where(condition, other),因此现在有效:

result = date_by_items.where(date_by_items > 0, 2)
Run Code Online (Sandbox Code Playgroud)


sho*_*yer 5

如果您乐于将数据作为 NumPy 数组加载到内存中,则可以使用 NumPy 修改 DataArray 值:

date_by_items.values[date_by_items.values > 0] = 2
Run Code Online (Sandbox Code Playgroud)

处理这个问题的最简洁的方法是,如果 xarray 支持 的other参数where,但我们还没有实现它(希望很快——基础已经奠定!)。当它起作用时,您将能够编写date_by_items.where(date_by_items > 0, 2).

无论哪种方式,您都需要执行此操作两次才能应用您的两个标准。