【问题标题】:xarray groupby: Apply different reducers to variablesxarray groupby:将不同的减速器应用于变量
【发布时间】:2022-02-26 01:24:23
【问题描述】:

我正在使用xarraygroupby + reducer 对空间栅格执行空间叠加/聚合。我想知道是否有办法为某些数据变量使用不同的减速器。例如,在下面的代码中,我希望将categorical_variable 减少为first()(或mode,但这似乎没有实现),并且continuous_variable 减少为mean()

import xarray as xr
import numpy as np

categorical_variable = np.array([[1,1,1,1,1],
                                 [1,1,1,1,2],
                                 [1,1,1,2,2],
                                 [1,1,2,2,2],
                                 [1,2,2,2,2]], dtype='int16')
grouping_variable = np.array([[1,1,1,2,2],
                              [1,1,3,2,2],
                              [1,3,3,3,3],
                              [3,3,3,3,3],
                              [4,4,4,4,4]], dtype='int16')
continuous_variable = np.random.rand(5,5)
xr_dataset = xr.Dataset({'grouping_variable': xr.DataArray(grouping_variable,
                                                           dims=['x', 'y']),
                         'categorical_variable': xr.DataArray(categorical_variable,
                                                              dims=['x', 'y']),
                         'continuous_variable': xr.DataArray(continuous_variable,
                                                             dims=['x', 'y'])})
xr_grouped = xr_dataset.groupby('grouping_variable')
xr_reduced = xr_grouped.mean()

【问题讨论】:

    标签: python numpy python-xarray xarray


    【解决方案1】:

    这在目前 AFAIK 的 xarray 中是不可能一次性完成的,但由于无论如何你都失去了空间结构,你可以通过 pandas 非常简单地使用agg

    >>> df = xr_dataset.to_dataframe()
    >>> df.groupby('grouping_variable').agg({"categorical_variable": "first",
                                             "continuous_variable": "mean"})
    
                       categorical_variable  continuous_variable
    grouping_variable                                           
    1                                     1             0.458534
    2                                     1             0.822294
    3                                     1             0.539483
    4                                     1             0.515586
    

    【讨论】:

      【解决方案2】:

      性能不是最佳的,但这是我最终做的:

      xr_dataset = xr.merge([
        xr_dataset.categorical_variable.groupby('grouping_variable').first(),
        xr_dataset.continuous_variable.groupby('grouping_variable').mean(),
        ...
      ])
      

      【讨论】:

        猜你喜欢
        • 2021-12-12
        • 2017-08-21
        • 1970-01-01
        • 2020-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多