簡體   English   中英

將多維Xarray轉換為DataFrame - Python

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM