xarray 分组 median 报索引不唯一,重复组标签别删
xarray 2026.9.0 与 flox、Dask 的分组中位数可能在重索引失败。局部禁用 flox 走替代计算路径,保留合法重复分组和分块语义。
对分块 DataArray 执行 .groupby("x").median(),堆栈落在 flox 的重索引,最后报 Reindexing only valid with uniquely valued Index objects。x 里出现重复标签可能正是分组的目的,不能看到这个错误就删除重复观测。
明确组合为 xarray 2026.9.0、flox 0.11.2、Dask 2026.7.1、pandas 2.3.3。一组交错标签 1,2,1,2 在这条分组归约路径触发回归;它与用户真的拿非唯一索引去做普通重索引不同。
将执行路径限制在当前归约
对于确认进入 flox 的这条失败路径,可以在本次操作中禁用 flox:
import xarray as xr
with xr.set_options(use_flox=False):
result = arr.groupby("x").median()
arr 是原有 DataArray,不要先去重或重排观测。上下文退出后恢复外部选项,其他任务仍可使用原执行路径。构建了懒结果时,后续计算仍要按应用管理资源;得到一个对象不等于归约已经完成。
这可能改变性能和分块行为。Dask 的中位数不能简单地把各块中位数再平均,某些分块形状需要额外重组或内存。若替代路径提示不支持当前多块归约,应按数据规模评估重分块或小范围加载,不能未经预算将全量数据放进单块。
用交错组核对结果
一个可推导样本是行值依次为 [0,1]、[2,3]、[4,5]、[6,7],行标签为 1,2,1,2。按行标签分组,中位数分别应为 [2,3] 和 [4,5]。验收按输出组标签配对比较,不依赖屏幕上的偶然排列顺序。
再检查实际业务中的缺失值政策、待归约维度、剩余坐标、属性和 dtype。重复标签是组成员关系,删除后就少了样本;把标签改成每行唯一则把分组问题变成了逐行结果。
若数据有多重分组、多个归约轴或特殊 skipna 设置,应保留原参数复查,不能把这个一维分组样本当作所有 flox 错误的统一答案。
别把 pandas 最后一行异常当成根因
本题最后的异常由 pandas 抛出,但上游是 xarray 与 flox 对分组结果的整理。只升级或降级 pandas,未必改变那条路径;直接改动 flox 的私有重索引函数也会让环境偏离锁文件。
先记录完整依赖组合和原分块,保留局部开关调整前后的结果。正式 xarray 2026.9.0 的分组代码仍有该适配路径;后续问题关闭或开发修补,不足以指定一个未经核对的“已修复正式版”。更新后在启用 flox 的原配置下重新执行交错组及真实小范围样本,确认数值、组标签和资源使用都可接受,再移除局部选项。


