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