如何在xarray中执行类似pandas的合并?

问题描述 投票:0回答:1

我有一个长数据框,具有单个重复维度(国家/地区)和默认索引,以及一个共享相同维度(国家/地区)并具有额外维度(时间)的二维数据框

我想将 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')
python numpy python-xarray
1个回答
0
投票

问题似乎出在 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/

© www.soinside.com 2019 - 2024. All rights reserved.