如何将带有复合 header 的 .csv 读入 xarray DataArray(使用 pandas)
How to read .csv with a compound header into a xarray DataArray (using pandas)
给定具有以下结构的数据集:
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 加载到 3d 数组中,例如xarray DataArray?
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
但是,要进入 3 维数组,我们必须将其投影到我们可用的轴的笛卡尔积中。
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]]])
给定具有以下结构的数据集:
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 加载到 3d 数组中,例如xarray DataArray?
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
但是,要进入 3 维数组,我们必须将其投影到我们可用的轴的笛卡尔积中。
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]]])