如何基于公共坐标合并两个xarray.Dataset对象
解决xarray.Dataset合并错误并实现关联匹配
错误原因
你使用xr.combine_nested的方式不正确:该函数用于处理嵌套列表结构的数据集(例如[[ds1, ds2], [ds3, ds4]]),但你传入的是一维列表[obs, pos],却指定了2个concat维度,因此触发维度不匹配的错误。
你的核心需求是基于player_id和opponent_id将obs的赛事数据与pos中对应选手组合的参数(alpha、beta)关联,正确的做法是先对齐坐标,再合并数据集。
修正步骤与代码
1. 修正pos中的拼写错误
pos的坐标里写了oppponent_id(多了一个p),这会导致后续坐标匹配失败,先修正:
pos = xr.Dataset( data_vars=dict( alpha=(['chain', 'draw', 'player_id', 'opponent_id'], alpha), beta=(['chain', 'draw', 'player_id', 'opponent_id'], beta), ), coords=dict( chain=(['chain'], list(range(N_CHAINS))), draw=(['draw'], list(range(N_DRAWS))), player_id=(['player_id'], list(range(N_PLAYERS))), opponent_id=(['opponent_id'], list(range(N_PLAYERS))), # 修正拼写错误 ), )
2. 给obs添加player_id和opponent_id坐标
从h2h_id的MultiIndex中提取对应的选手ID,作为独立坐标,方便和pos对齐:
obs = obs.assign_coords( player_id=('h2h_id', h2h_idx.get_level_values('player_id')), opponent_id=('h2h_id', h2h_idx.get_level_values('opponent_id')) )
3. 合并数据集
使用xr.merge,xarray会自动根据共同的player_id和opponent_id坐标,将pos中的alpha、beta广播到obs的每个h2h_id条目上:
combined = xr.merge([obs, pos])
最终效果
合并后的combined数据集包含以下维度和坐标:
- 维度:
h2h_id,chain,draw - 坐标:
h2h_id,player_id,opponent_id,chain,draw - 数据变量:
n_points_won,n_points_lost,alpha,beta
每个h2h_id对应的赛事数据,都会关联到所有chain和draw下对应选手组合的alpha、beta参数值。
内容的提问来源于stack exchange,提问作者HJA24
相关产品推荐
相关产品推荐

