如何将带有复合标头的.csv读取到xarray DataArray中(使用pandas)

Gri*_*mar 5 python csv pandas python-xarray

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

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
Run Code Online (Sandbox Code Playgroud)

以 .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
Run Code Online (Sandbox Code Playgroud)

注意:缺少一些值,并非所有变量都适用于所有位置,时间戳适用于每个记录,列可能会出现乱序,但时间戳可靠地是第一列。我不确定所有这些方面都与最佳解决方案相关,但它们确实存在。

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

问题:是否有一些紧凑且有效的方法(可能使用 pandas 和 xarray)将此数据集或任何类似的数据集(具有不同的变量和位置名称)从 .csv 加载到 3d 数组(如 xarray DataArray)中?

piR*_*red 4

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
Run Code Online (Sandbox Code Playgroud)

然而,为了进入 3D 数组,我们必须将其投影到可用轴的笛卡尔积中。

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
Run Code Online (Sandbox Code Playgroud)

然后使用numpy.reshapenumpy.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]]])
Run Code Online (Sandbox Code Playgroud)