[英]Convert multi-dimension Xarray into DataFrame - Python
我有一個 4 維的大數組,如下所示:
>>> raw_data
<xarray.DataArray 'TRAC04' (time: 3, Z: 34, YC: 588, XC: 2160)>
[129548160 values with dtype=float32]
Coordinates: (12/15)
iter (time) int64 ...
* time (time) datetime64[ns] 2017-01-30T12:40:00 ... 2017-04-01T09:20:00
* XC (XC) float32 0.08333 0.25 0.4167 0.5833 ... 359.6 359.8 359.9
* YC (YC) float32 -77.98 -77.95 -77.91 -77.88 ... -30.02 -29.87 -29.72
* Z (Z) float32 -2.1 -6.7 -12.15 -18.55 ... -614.0 -700.0 -800.0
rA (YC, XC) float32 ...
... ...
maskC (Z, YC, XC) bool ...
maskCtrlC (Z, YC, XC) bool ...
rhoRef (Z) float32 ...
rLowC (YC, XC) float32 ...
maskInC (YC, XC) bool ...
rSurfC (YC, XC) float32 ...
Attributes:
standard_name: TRAC04
long_name: Variable concentration
units: mol N/m^3
我想將其轉換為具有 5 列的 Dataframe,分別為“XC”、“YC”、“Z”、“時間”、“TRAC04”。
我試着像這樣關注這個問題:
import itertools
data = list(itertools.chain(*raw_data))
df = pd.DataFrame.from_records(data)
它運行它,但是,我沒有看到在環境中創建任何東西。 此外,如果我嘗試用pd.head(df)
查看df
,它確實會永遠運行,而不會返回輸出。
在任何情況下,我都嘗試在這個問題之后保存df
,但在這種情況下它也沒有結束地運行:
np.savetxt(r'c:\data\DF_TRAC04.txt', df.values, fmt='%d')
df.to_csv(r'c:\data\DF_TRAC04.csv', header=None, index=None, sep=' ', mode='a')
我希望我的回答仍然可以提供幫助。
讓我們首先創建一個帶有空間變量 x、y、z 和時間變量 t 的模擬數據。
import numpy as np
import xarray as xr
val = np.arange(54).reshape(2,3,3,3)
xc = np.array([10, 20, 30])
yc = np.array([50, 60, 70])
zc = np.array([1000, 2000, 3000])
t = np.array([0, 1])
da = xr.DataArray(
val,
coords={'time': t,
'z': zc,
'y': yc,
'x': xc},
dims=["time","z","y", "x"]
)
您將獲得以下DataArray
:
<xarray.DataArray (time: 2, z: 3, y: 3, x: 3)>
array([[[[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8]],
[[ 9, 10, 11],
[12, 13, 14],
[15, 16, 17]],
[[18, 19, 20],
[21, 22, 23],
[24, 25, 26]]],
[[[27, 28, 29],
[30, 31, 32],
[33, 34, 35]],
[[36, 37, 38],
[39, 40, 41],
[42, 43, 44]],
[[45, 46, 47],
[48, 49, 50],
[51, 52, 53]]]])
Coordinates:
* time (time) int64 0 1
* z (z) int64 1000 2000 3000
* y (y) int64 50 60 70
* x (x) int64 10 20 30
如果你想有一個 DataArray 的平面文件表示,你可以使用
da.to_dataframe(name='value').reset_index()
這是結果:
time z y x value
0 0 1000 50 10 0
1 0 1000 50 20 1
2 0 1000 50 30 2
3 0 1000 60 10 3
4 0 1000 60 20 4
...
49 1 3000 60 20 49
50 1 3000 60 30 50
51 1 3000 70 10 51
52 1 3000 70 20 52
53 1 3000 70 30 53
DataFrame
保存到沒有索引的 ASCII 文件中,請使用:
da.to_dataframe(name='value').reset_index().to_csv('dump.csv', index=False)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.