我有3d xarray
DataArray
量的时间数据,用于多次运行模型。因此,通过模拟时间步长对行进行索引,列只是围绕模型捕获的各种变量,然后深度坐标代表单个模拟运行,因为我多次运行了整个模拟。
我的目标是采用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
我希望将其转换为类似
的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
答案 0 :(得分:1)
使用测试数据,您可以使用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
答案 1 :(得分:1)
您可以先使用.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
所有“运行”值都存在,即使为简洁起见,默认表示仅显示重复组中的第一个:
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