python - Python Xarray:如何将 3-d DataArray 转换为 2-d 堆叠 Pandas 数据框
问题描述
我有xarray
DataArray
一个模型的多次运行的时间序列数据的 3d 数据量。所以行由模拟时间步长索引,列只是关于模型捕获的各种变量,然后深度坐标代表单个模拟运行,因为我多次运行整个模拟。
我的目标是获取这个 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
我希望将其转换为 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()
and 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
推荐阅读
- python - get_absolute_url 在 django 1.7 中不起作用?
- linq - 在 LINQ 中组合 Where 和 Cast 的操作
- java - 如何使用整数参数组织对象
- ffmpeg - 将视频水平或垂直切成两半并稍后重新加入的命令
- python - 尝试将图像数据输入 DNNRegressor 时出现 ValueError
- groovy - Groovy - XmlSlurper - 计数节点
- opencv - 从 64 位切换到 32 位 openCV 时出现链接错误
- gitlab - 使用本地 Jekyll 安装测试 Gitlab 页面时集成静态内容
- assembly - 搜索字符串中出现的字符数
- c# - C# WinForms 中 Windows Media Player 元素上的透明按钮