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

时间:2016-08-10 22:01:23

标签: python python-xarray

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

  1. 其中值> 0,make 2
  2. 如果值== 0,则为0
  3. 如果值为NaN,请设为NaN
  4. 这是我目前的解决方案。我正在使用NaN s,.fillna和&类型强制代替2d索引。

    valid = date_by_items.notnull()
    positive = date_by_items > 0
    positive = positive * 2
    result = positive.fillna(0.).where(valid)
    result
    

    这改变了这个:

    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
    

    ......对此:

    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
    

    虽然在pandas df[df>0] = 2就足够了。当然,我正在做一些步行的事情而且还有一种方式吗?

2 个答案:

答案 0 :(得分:4)

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

.git

最简单的处理方法是,如果xarray支持date_by_items.values[date_by_items.values > 0] = 2 的{​​{1}}参数,但我们尚未实现(希望很快 - 已奠定基础!)。如果有效,您将能够撰写other

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

答案 1 :(得分:4)

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

result = date_by_items.where(date_by_items > 0, 2)