【发布时间】:2020-11-14 20:17:31
【问题描述】:
我是迁移到 Xarray 的 Pandas 用户,因为我使用地理空间 3D 数据。 有些东西我只知道如何使用 Pandas,而且很多时候将其转换为 Pandas DataFrame 然后将其重新转换为 Xarray Dataset 对象没有任何意义。
我要做的是用两个新维度替换 Xarray object 的当前维度,而这两个新维度当前是 Xarray object 中的数据变量。
我们从data 是Xarray 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
我要做的是重塑和重新索引变量Value1 和Value2 以分配Letter 和Number 作为其维度。
我习惯的做法是:
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