pythonxarray:如何将三维数据数组转换为二维数据帧

pythonxarray:如何将三维数据数组转换为二维数据帧,python,pandas,python-xarray,Python,Pandas,Python Xarray,我有一个3dxarrayDataArray模型多次运行的时间序列数据的数据量。因此,行由simulation timestep索引,列只是关于模型捕获的各种变量,深度坐标表示单个模拟运行,因为我多次运行整个模拟 我的目标是将这个3dxarrayDataArray转换为2dpandas数据帧,以便将其导出为CSV文件。为了做到这一点,我需要将每个模拟运行叠加在一起,以便将3d阵列转换为2d阵列 我有一些代码来生成一些测试数据,但我对Xarray不够熟悉,不知道如何进行这种堆叠 下面是一些开发测试数

我有一个3d
xarray
DataArray
模型多次运行的时间序列数据的数据量。因此,行由simulation timestep索引,列只是关于模型捕获的各种变量,深度坐标表示单个模拟运行,因为我多次运行整个模拟

我的目标是将这个3d
xarray
DataArray
转换为2d
pandas
数据帧,以便将其导出为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
此代码将生成一个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
有什么建议吗

更新:

根据@rahlf23和@DSM的评论,我在这方面有些运气
simulation\u matrix.to\u dataframe('fred').unstack()


使用您的测试数据,您可以使用
来_pandas()
pd.concat()

收益率:

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
然后
取消堆栈
,只需传递一个名称以附加到数据集(它将成为包含该值的列):

所有“运行”值都存在,即使默认表示形式仅显示重复组中的第一个值,以保持简洁:

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

我试过了,但似乎不起作用。我尝试了
simulation\u matrix.to\u dataframe().unstack()
,但出现了一个错误
无法将未命名的数据数组转换为数据帧:使用``name``参数
unstack
的想法是正确的吗?文档中没有显示任何代码示例,因此很难判断这些命令的作用。请尝试
simulation\u matrix.iloc[:,:,1].to\u pandas()
:您只需将名称添加到
to\u dataframe
,如
。to\u dataframe(“fred”).unstack()
,但我不确定我是否理解您的预期顺序:我本以为您会想要整行1,而不是[1,0,0,0]。您知道,我只是尝试了一下。但我收到了一个
弃用警告:面板已弃用,将在将来的版本中删除。
因此,我似乎需要使用多索引方法。我只是想弄清楚如何使多索引工作,因为我在熊猫中没有使用它。@krishnab:这就是多索引的表示方式。你可以添加
.reset\u index()
来确认它们都在那里。太好了。我知道你是怎么做到的。非常感谢你在这方面的帮助。没问题,很高兴我能帮忙!这真的很有帮助。非常感谢你的建议。这确实让我比以前走得更远了。
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
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
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