[英]How can I reshape data in a csv into a structured format?
我有一些从计算流体动力学模拟生成的 .csv 文件。 它们包含空间中给定点的速度、压力、密度等值。 对于每个点,其坐标和该点的字段值都打印在 csv 文件的一行中。 对于 x 值为 1、2、3 且 y 值为 4、5、6 的二维网格,数据按以下方式排列:
X Y (field variables)
1 4 :
2 4 :
3 4 :
1 5 :
2 5 :
3 5 :
1 6 :
2 6 :
3 6 :
我们从最低的 y 值开始,循环遍历所有 x 值,然后 go 到下一个 y 值并重复。
我想做的是将这些数据放入结构化格式中。 即,我想将数据放入使用 x 和 y 值作为坐标轴的 xarray 数据集中,或者将这些值放入适当形状的 numpy ndarray(在本例中为 3x3)。 我可以将文件加载到 Pandas dataframe 中,然后使用 for 循环手动重组数据,但即使是中等大的数据文件,这也非常慢。 我想要一种使用 pandas、numpy 和 xarray 库中的内置函数的更快方法。
有人有什么想法吗?
这里是 CFD 研究员。 我相信这可以通过一个 for 循环手动完成,该循环仅迭代您的 state 变量列表(即 rho)。
# https://stackoverflow.com/questions/75278985/how-can-i-reshape-data-in-a-csv-into-a-structured-format
import time
start = time.time()
import numpy as np
import pandas as pd
df = pd.read_csv('test_data.csv')
min_x_coor = min(df['x'])
min_y_coor = min(df['y'])
x_dim = max(df['x']) - min_x_coor + 1
y_dim = max(df['y']) - min_y_coor + 1
rho_array = np.zeros((x_dim, y_dim))
for p in range(0, len(df['rho'])):
x_coor = df['x'][p] - min_x_coor
y_coor = df['y'][p] - min_y_coor
rho_array[x_coor][y_coor] = df['rho'][p]
print(rho_array)
print(time.time() - start)
对于 3x3 数据:
x,y,rho
1,4,0.503
2,4,0.642
3,4,0.041
1,5,0.340
2,5,0.269
3,5,0.288
1,6,0.511
2,6,0.732
3,6,0.195
Output:
[[0.503 0.34 0.511]
[0.642 0.269 0.732]
[0.041 0.288 0.195]]
0.31889796257019043
对于 4x4 数据:
x,y,rho
1,4,0.503
2,4,0.642
3,4,0.041
4,4,0.964
1,5,0.340
2,5,0.269
3,5,0.288
4,5,0.702
1,6,0.511
2,6,0.732
3,6,0.195
4,6,0.226
1,7,0.957
2,7,0.032
3,7,0.304
4,7,0.607
Output:
[[0.503 0.34 0.511 0.957]
[0.642 0.269 0.732 0.032]
[0.041 0.288 0.195 0.304]
[0.964 0.702 0.226 0.607]]
0.48914408683776855
这是一起使用 Xarray 和 Pandas 的示例:
from io import StringIO
import pandas as pd
import xarray as xr
s = StringIO("""x,y,rho
1,4,0.503
2,4,0.642
3,4,0.041
4,4,0.964
1,5,0.340
2,5,0.269
3,5,0.288
4,5,0.702
1,6,0.511
2,6,0.732
3,6,0.195
4,6,0.226
1,7,0.957
2,7,0.032
3,7,0.304
4,7,0.607
""")
# open csv, create a MultiIndex from x/y columns
df = pd.read_csv(s, index_col=['x', 'y'])
# convert to Xarray Dataset
ds = df.to_xarray()
# copy over the multiindex
ds['points'] = df.index
# use ds.unstack to reshape
ds = ds.unstack()
这将生成如下所示的 Xarray 数据集:
<xarray.Dataset>
Dimensions: (x: 4, y: 4)
Coordinates:
* x (x) int64 1 2 3 4
* y (y) int64 4 5 6 7
Data variables:
rho (x, y) float64 0.503 0.34 0.511 0.957 ... 0.964 0.702 0.226 0.607
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.