【问题标题】:Multidimensional xarray to dataframe to excel多维xarray到数据框到excel
【发布时间】:2021-12-31 10:34:36
【问题描述】:

我在 python 中构建了一个三维 xarray

import numpy as np
import pandas as pd
import xarray as xr

data_np = np.array([ 
                [ [1, 2, 0, 8], [3, 4, 11, 2], [5, 6, 43, 90] ],
                [ [7, 8, 2, 66], [9, 10, 31, 21], [11, 12, 56, 45] ] 
                ])

dims = ['patient', 'parameter', 'day']

coords = {'patient':['Joe','Bill'], 'parameter':['a', 'b', 'c'], 'day':[0, 1, 2, 3]}

data = xr.DataArray(data_np, dims = dims, coords = coords )

我想将它导出到具有这种结构的 excel 工作表中:

所需的输出

使用 Pandas 数据框,我可以获得所有变量(dims)沿同一轴分支的 excel 表:

df = data.to_dataframe('value')
df = df.transpose()

with pd.ExcelWriter("main.xlsx") as writer: 
    df.to_excel(writer)

获得的输出

我怎样才能得到想要的结构?

【问题讨论】:

    标签: python excel pandas python-xarray


    【解决方案1】:

    您可以使用unstack() 方法随意排列数据:

    import numpy as np
    import pandas as pd
    import xarray as xr
    
    data_np = np.array([ 
                    [ [1, 2, 0, 8], [3, 4, 11, 2], [5, 6, 43, 90] ],
                    [ [7, 8, 2, 66], [9, 10, 31, 21], [11, 12, 56, 45] ] 
                    ])
    
    dims = ['patient', 'parameter', 'day']
    
    coords = {'patient':['Joe','Bill'], 'parameter':['a', 'b', 'c'], 'day':[0, 1, 2, 3]}
    
    data = xr.DataArray(data_np, dims = dims, coords = coords )
    
    df = data.to_series().unstack(level=[1,2])
    with pd.ExcelWriter("main.xlsx") as writer: 
        df.to_excel(writer)
    

    或者你可以避免使用xarray,而使用pd.MultiIndex直接从NumPy数组创建DataFrame:

    import numpy as np
    import pandas as pd
    
    data_np = np.array([ 
                    [ [1, 2, 0, 8], [3, 4, 11, 2], [5, 6, 43, 90] ],
                    [ [7, 8, 2, 66], [9, 10, 31, 21], [11, 12, 56, 45] ] 
                    ])
    
    dims = ['patient', 'parameter', 'day']
    
    coords = {'patient':['Joe','Bill'], 'parameter':['a', 'b', 'c'], 'day':[0, 1, 2, 3]}
    
    mi = pd.MultiIndex.from_product([coords[dims[i]] for i in range(3)], names=dims)
    df = pd.Series(data_np.flatten(), index=mi).unstack(level=[1,2])
    
    with pd.ExcelWriter("main.xlsx") as writer: 
        df.to_excel(writer)
    

    【讨论】:

      【解决方案2】:

      使用unstack:

      data.to_dataframe('value').unstack(level=[1, 2]).droplevel(level=0, axis=1) \
          .rename_axis(index=None, columns=['Parameter', 'Patient / Day'])
      

      【讨论】:

        猜你喜欢
        • 2017-04-11
        • 2021-12-17
        • 2017-09-14
        • 1970-01-01
        • 2016-09-07
        • 1970-01-01
        • 2019-04-11
        • 2021-11-30
        • 2019-08-10
        相关资源
        最近更新 更多