【问题标题】:How to replace the current dimension of an xarray object with two new ones如何用两个新维度替换 xarray 对象的当前维度
【发布时间】:2020-11-14 20:17:31
【问题描述】:

我是迁移到 Xarray 的 Pandas 用户,因为我使用地理空间 3D 数据。 有些东西我只知道如何使用 Pandas,而且很多时候将其转换为 Pandas DataFrame 然后将其重新转换为 Xarray Dataset 对象没有任何意义。

我要做的是用两个新维度替换 Xarray object 的当前维度,而这两个新维度当前是 Xarray object 中的数据变量。

我们从dataXarray object 开始,就像:

<xarray.Dataset>
Dimensions:  (index: 9)
Coordinates:
  * index    (index) int64 0 1 2 3 4 5 6 7 8
Data variables:
    Letter   (index) object 'A' 'A' 'A' 'B' 'B' 'B' 'C' 'C' 'C'
    Number   (index) int64 1 2 3 1 2 3 1 2 3
    Value1   (index) float64 0.5453 1.184 -1.177 0.8232 ... -1.253 0.3274 -1.583
    Value2   (index) float64 -0.4184 -0.3325 0.6826 ... -0.264 0.07381 0.4357

我要做的是重塑和重新索引变量Value1Value2 以分配LetterNumber 作为其维度。 我习惯的做法是:

reindexed = data.to_dataframe().set_index(['Letter','Number']).to_xarray()

返回:

<xarray.Dataset>
Dimensions:  (Letter: 3, Number: 3)
Coordinates:
  * Letter   (Letter) object 'A' 'B' 'C'
  * Number   (Number) int64 1 2 3
Data variables:
    Value1   (Letter, Number) float64 0.5453 1.184 -1.177 ... 0.3274 -1.583
    Value2   (Letter, Number) float64 -0.4184 -0.3325 0.6826 ... 0.07381 0.4357

如果数据不是太大,这很有效,但这对我来说似乎很愚蠢,因为当我转换为 DataFrame 时它会将其加载到内存中。我想找到一种仅使用 Xarray 更快、更轻松地完成相同事情的方法。

为了帮助重现同样的问题,我在下面编写了一个代码,只是为了创建一个类似于我在阅读 NetCDF 文件后拥有的数据。

import numpy as np
import pandas as pd


df = pd.DataFrame()
df['Letter'] = 'A A A B B B C C C'.split()
df['Number'] = [1,2,3,1,2,3,1,2,3]
df['Value1'] = np.random.randn(9)
df['Value2'] = np.random.randn(9)
data = df.to_xarray()

【问题讨论】:

  • 我个人在处理空间数据时使用 geopandas。换乘很简单
  • 请考虑修改您的问题,因为使用的语言令人困惑。如果我理解正确,您想要做的是将 xarray 对象的当前维度替换为两个新维度,而这两个新维度当前是 xarray 对象中的数据变量。对吗?
  • @RobertWilson,是的,这就是我想要做的。我编辑了这个问题。好点了吗?

标签: python pandas multi-index python-xarray reindex


【解决方案1】:

您应该可以使用以下代码执行此操作。您无法删除 xarray 中的维度,因此您必须先将“index”的值替换为 Letter 或 Number 的值,然后重命名索引维度。

import numpy as np
import pandas as pd

df = pd.DataFrame()
df['Letter'] = 'A A A B B B C C C'.split()
df['Number'] = [1,2,3,1,2,3,1,2,3]
df['Value1'] = np.random.randn(9)
df['Value2'] = np.random.randn(9)
data = df.to_xarray()

(
data
 .assign_coords({"index": data.Letter.values})
 .assign_coords({"Number":data.Number.values})
 .drop("Letter")
 .rename_dims({"index":"Letter"})      
 .rename({"index":"Letter"})        
)

【讨论】:

  • 嗨罗伯特,这段代码只将变量字母分配给变量。 Dimensions without coordinates: Letter Value1 (Letter) Value2 (Letter) 我要做的是同时分配字母和数字。
  • 我忘记重命名坐标了。我不确定你的坐标尺寸来自哪里
猜你喜欢
  • 2016-05-01
  • 1970-01-01
  • 2022-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-12
  • 2017-01-30
相关资源
最近更新 更多