我有一个长数据框,具有单个重复维度(国家/地区)和默认索引,以及一个共享相同维度(国家/地区)并具有额外维度(时间)的二维数据框
我想将 xr.DataSet 中的两个对象左侧合并,以便左侧对象的每个默认索引根据匹配国家/地区与右侧对象的 1 个向量(随着时间的推移)相关联
当我使用 xarray 执行合并并从左侧对象中选择特定的默认索引时,我获得了第二个对象的所有可能组合,而不考虑相应的国家/地区。示例显示了使用 pandas 的所需结果:
df1 = pd.DataFrame({
'country': 4*['UK','US','FR','DE'],
'var1': 10*np.arange(16),
}).reset_index(names='N')
ds1 = df1.set_index(['N','country']).to_xarray()
df2 = pd.DataFrame({
'country': 4*['UK'] + 4*['US'] + 4*['FR'] + 4*['DE'],
'time': 4*list(pd.timedelta_range(
start='30D',
periods=4,
freq='30D'
)),
'var2': 20*np.arange(16),
})
ds2 = df2.set_index(['country','time']).to_xarray()
# 1. xarray merge
ds3 = ds1.merge(ds2, join='left')
# Selecting specific original index
# returns all possible combinations without recognising corresponding country
display(ds3.sel(N=1).var2)
# 2. pandas merge
df3 = df1.set_index(['N','country']).merge(
df2.pivot(index='country', columns='time'),
left_index=True,
right_index=True
)
# Selecting specific original index
# returns only vector for corresponding country
df3.xs(1, level='N')
问题似乎出在 xarray 处理合并的方式上,这并没有保留“N”和“国家/地区”之间的关系。您应该首先合并 pandas 中的 DataFrame,然后将结果转换为 xarray DataSet。
即
merged_df = pd.merge(df1, df2, on='country')
merged_ds = merged_df.set_index(['N', 'country', 'time']).to_xarray()
来源:我的文章https://ioflood.com/blog/how-to-use-pandas-merge-with-dataframe-objects/