代码之家  ›  专栏  ›  技术社区  ›  Grismar

如何阅读。将带有复合标头的csv放入xarray数据阵列(使用pandas)

  •  4
  • Grismar  · 技术社区  · 8 年前

    给定具有以下结构的数据集:

    time  var1  var2  var2  var1  var3
          loc1  loc1  loc2  loc2  loc1
    1     11    12    13    14    15
    2     21    22    23          25
    3           32    33    34    35
    

    作为一个。csv:

    time,var1,var2,var2,var1,var3
    ,loc1,loc1,loc2,loc2,loc1
    1,11,12,13,14,15
    2,21,22,23,,25
    3,,32,33,34,35
    

    我在设置xarray三维数组时没有遇到太多问题,该数组允许我通过时间戳、位置和变量名访问值。在确定唯一的位置名称后,它循环遍历位置名称,按位置过滤数据,并将结果一次添加到一个位置。但我想知道,由于没有更好的词,pythonic和pandastic解决方案会是什么样子?

    问:是否有一些紧凑而有效的方法(可能使用pandas和xarray)从中加载此数据集或任何类似的数据集(具有不同的变量和位置名称)。将csv转换为类似xarray DataArray的3d阵列?

    1 回复  |  直到 4 年前
        1
  •  4
  •   Grismar    8 年前
    df = pd.read_csv('tst.csv', header=[0, 1], index_col=0).sort_index(1)
    
    time  var1       var2      var3
          loc1  loc2 loc1 loc2 loc1
    1     11.0  14.0   12   13   15
    2     21.0   NaN   22   23   25
    3      NaN  34.0   32   33   35
    

    然而,要进入三维阵列,我们必须将其投影到可用轴的笛卡尔乘积中。

    cols = pd.MultiIndex.from_product(df.columns.levels)
    
    d1 = df.reindex(columns=cols)
    d1
    
       var1       var2      var3     
       loc1  loc2 loc1 loc2 loc1 loc2
    1  11.0  14.0   12   13   15  NaN
    2  21.0   NaN   22   23   25  NaN
    3   NaN  34.0   32   33   35  NaN
    

    然后使用 numpy.reshape numpy.transpose

    d1.values.reshape(3, 3, 2).transpose(1, 0, 2)
    
    array([[[ 11.,  14.],
            [ 21.,  NaN],
            [ NaN,  34.]],
    
           [[ 12.,  13.],
            [ 22.,  23.],
            [ 32.,  33.]],
    
           [[ 15.,  NaN],
            [ 25.,  NaN],
            [ 35.,  NaN]]])