如何在xarray DataArrayGroupBy对象上调用.sel()方法
可行替代方案
不需要重复执行完整的groupby_bins分箱计算,两种实现均可满足需求:
方案1:先筛选维度,再复用已有分箱边界生成GroupBy对象
该方案完全匹配你预期的返回DataArrayGroupBy类型、后续可灵活调用各类聚合方法的需求,且不会重复计算分箱逻辑,性能和直接对GroupBy对象调用.sel()基本一致:
# 提取已生成的分箱边界和分组参考坐标,避免重复分箱计算 existing_bins = foo_grouped.bins group_ref = foo.sel(a=0) # 先完成a维度的取值筛选 foo_filtered = foo.sel(a=slice(5, 10)) # 复用已有分箱边界生成分组对象,返回值为标准DataArrayGroupBy类型 foo_grouped_sel = foo_filtered.groupby_bins(group_ref, bins=existing_bins) # 后续可直接调用任意聚合方法 mean_res = foo_grouped_sel.mean() sum_res = foo_grouped_sel.sum()
注意:你给出的示例代码中a维度坐标为
range(5)(取值范围0-4),a=slice(5,10)会匹配到空值,实际使用时替换为真实数据的有效a坐标范围即可。
方案2:调用GroupBy原生.map()方法逐组执行筛选+计算
如果你不需要保留GroupBy对象做后续多次操作,仅需要得到最终计算结果,可直接用GroupBy内置的map方法遍历每个分组执行自定义逻辑,无需重新生成分组对象:
def group_calc(group): # 对单个分组内的数据先做a维度筛选,再执行目标聚合 return group.sel(a=slice(5, 10)).mean() # 直接在已有分组对象上执行计算,直接返回聚合结果 final_result = foo_grouped.map(group_calc)
两种方案的选择逻辑:
- 若需要对筛选后的分组执行多次不同聚合操作,选方案1
- 若仅需要单次计算得到最终结果,选方案2即可
内容的提问来源于stack exchange,提问作者jspaeth
相关产品推荐
相关产品推荐

