我有一个3D的DataArray
数据,它是多个模型运行的时间序列数据。因此,行是由模拟时间步骤索引的,列是有关模型捕获的各种变量,而深度坐标表示单个模拟运行,因为我多次运行整个模拟。
我的目标是将这个3D的DataArray
转换成2D的dataframe
,以便我可以将其导出为CSV文件。为了做到这一点,我需要将每个模拟运行堆叠在一起,这样3D数组就被转换为2D数组。
我有一些生成测试数据的代码,但我对不够熟悉,不知道如何进行这种堆叠操作。
这里是一些用于生成测试数据的代码。
import xarray as xr
import pandas as pd
import numpy as np
from tqdm import tqdm
results_matrix = np.zeros([5, 7, 4])
simulation_matrix = xr.DataArray(results_matrix,
coords={'simdata': ['val1', 'val2','val3','val4'],
'run': range(5),
'year': range(7)},
dims=('run', 'year', 'simdata'))
itercount = 0
for i in tqdm(range(5)):
simulation_matrix[i, :, :] = i
itercount += 1
该代码将生成一个类似于DataArray的数据数组。
<xarray.DataArray (run: 5, year: 7, simdata: 4)>
array([[[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]],
[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]],
... Additional arrays truncated
我希望将此转换为二维的
Pandas
数据帧,类似于: [0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.],
[1., 0., 0., 0.],
[1., 0., 0., 0.],
[1., 0., 0., 0.],
[1., 0., 0., 0.],
[1., 0., 0., 0.],
[1., 0., 0., 0.],
[1., 0., 0., 0.]]]
有任何建议吗?
更新:
根据@rahlf23和@DSM的评论,我尝试使用simulation_matrix.to_dataframe('fred').unstack()
,并取得了一些成功。
fred
simdata val1 val2 val3 val4
run year
0 0 0 0.0 0.0 0.0 0.0
1 0.0 0.0 0.0 0.0
2 0.0 0.0 0.0 0.0
3 0.0 0.0 0.0 0.0
4 0.0 0.0 0.0 0.0
5 0.0 0.0 0.0 0.0
6 0.0 0.0 0.0 0.0
1 0 1.0 1.0 1.0 1.0
1 1.0 1.0 1.0 1.0
2 1.0 1.0 1.0 1.0
3 1.0 1.0 1.0 1.0
4 1.0 1.0 1.0 1.0
5 1.0 1.0 1.0 1.0
6 1.0 1.0 1.0 1.0
simulation_matrix.to_dataframe().unstack()
但是出现了错误cannot convert an unnamed DataArray to a DataFrame: use the ``name`` parameter
。使用unstack
是正确的想法吗?文档中没有显示任何代码示例,所以很难确定这些命令的作用。 - krishnabsimulation_matrix.iloc[:,:,1].to_pandas()
:http://xarray.pydata.org/en/stable/generated/xarray.DataArray.to_pandas.html - rahlf23to_dataframe
中添加一个名称,例如.to_dataframe("fred").unstack()
,但我不确定你期望的顺序是什么:我认为你想要整行都是1,而不是[1, 0, 0, 0]。 - DSMsimulation_matrix.to_dataframe('fred').unstack()
然后它似乎以正确的方式处理了一些东西。问题是它似乎将运行编号只留下了一个单一的值而没有填充该列。让我更新一下原始帖子,看看情况如何。 - krishnab.reset_index()
来确认它们是否都在那里。 - DSM