Python Xarray:如何将 3-D DataArray 转换为 2-D 堆叠的 Pandas 数据帧



我有一个 3dxarrayDataArray数据量的时间序列数据,用于模型的多次运行。因此,行按模拟时间步长编制索引,列只是捕获的有关模型的各种变量,然后深度坐标表示单个模拟运行,因为我多次运行整个模拟。

我的目标是获取此 3DxarrayDataArray并将其转换为 2Dpandas数据帧,以便我可以将其导出为 CSV 文件。为了做到这一点,我需要将每个模拟运行堆叠在一起,以便将 3d 数组转换为 2d 数组。

我有一些代码来生成一些测试数据,但我对Xarray不够熟悉,不知道如何进行这种堆叠。

因此,这里有一些代码来开发测试数据。

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

此代码将生成一个看起来像

<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

我希望将其转换为 2dPandas数据帧,如下所示

[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

使用测试数据,您可以使用to_pandas()pd.concat()

df = pd.concat([simulation_matrix.loc[i,:,:].to_pandas() for i in range(simulation_matrix.shape[2])])

收益 率:

simdata  val1  val2  val3  val4
year                           
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
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
0         2.0   2.0   2.0   2.0
1         2.0   2.0   2.0   2.0
2         2.0   2.0   2.0   2.0
3         2.0   2.0   2.0   2.0
4         2.0   2.0   2.0   2.0
5         2.0   2.0   2.0   2.0
6         2.0   2.0   2.0   2.0
0         3.0   3.0   3.0   3.0
1         3.0   3.0   3.0   3.0
2         3.0   3.0   3.0   3.0
3         3.0   3.0   3.0   3.0
4         3.0   3.0   3.0   3.0
5         3.0   3.0   3.0   3.0
6         3.0   3.0   3.0   3.0

您可以使用.to_dataframe然后unstack,您只需要传递一个名称以附加到数据集(该数据集将成为包含该值的列(:

In [41]: simulation_matrix.to_dataframe("results").unstack()
Out[41]: 
results               
simdata     val1 val2 val3 val4
run year                       
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
2   0        2.0  2.0  2.0  2.0
1        2.0  2.0  2.0  2.0
2        2.0  2.0  2.0  2.0
3        2.0  2.0  2.0  2.0
4        2.0  2.0  2.0  2.0
5        2.0  2.0  2.0  2.0
6        2.0  2.0  2.0  2.0
3   0        3.0  3.0  3.0  3.0
1        3.0  3.0  3.0  3.0
2        3.0  3.0  3.0  3.0
3        3.0  3.0  3.0  3.0
4        3.0  3.0  3.0  3.0
5        3.0  3.0  3.0  3.0
6        3.0  3.0  3.0  3.0
4   0        4.0  4.0  4.0  4.0
1        4.0  4.0  4.0  4.0
2        4.0  4.0  4.0  4.0
3        4.0  4.0  4.0  4.0
4        4.0  4.0  4.0  4.0
5        4.0  4.0  4.0  4.0
6        4.0  4.0  4.0  4.0

所有"run"值都在那里,即使默认表示形式为了简洁起见,仅显示重复组中的第一个值:

In [50]: df = simulation_matrix.to_dataframe("results").unstack()
In [51]: df.reset_index().head()
Out[51]: 
run year results               
simdata             val1 val2 val3 val4
0         0    0     0.0  0.0  0.0  0.0
1         0    1     0.0  0.0  0.0  0.0
2         0    2     0.0  0.0  0.0  0.0
3         0    3     0.0  0.0  0.0  0.0
4         0    4     0.0  0.0  0.0  0.0

最新更新