我有一个数据框,其中的列包括纬度,经度,时间和数据值。我想重塑形状并将其转换为xarray数据数组,以使维度为时间x纬度/长对,但不确定执行此操作的最有效方法。
具体来说,数据框的结构如下:
Index Latitude Longitude Time Data
0 1 2 1 1
1 2 4 1 2
2 1 2 2 3
我希望对数据进行整形,使其最终成为矩阵:
Latitude 1/Longitude 2 Latitude 2/Longitude 4
Time 1 1 2
Time 2 3 Null
我目前正在通过在唯一的经/纬度组合上进行for循环,将每个另存为xarray,然后在经/纬度维度上将它们串联来实现此目的。
有什么方法可以提高数据重塑的效率?
答案 0 :(得分:5)
您想要的是数据透视,但是首先需要新的列名称:
df['col'] = 'Latitude' + df['Latitude'].astype(str) + '/Longitude' + df.Longitude.astype(str)
df.pivot(index='Time', columns='col', values='Data')
输出:
col Latitude1/Longitude2 Latitude2/Longitude4
Time
1 1.0 2.0
2 3.0 NaN
答案 1 :(得分:1)
这只是经典的数据透视表,在列上进行了自定义。 @QuangHoang提供了pivot
解决方案。这是crosstab
解决方案,其后的多索引列变平
df1 = pd.crosstab(index=df.Time, columns=['Latitude '+df.Latitude.astype(str),
'Longitude '+df.Longitude.astype(str)],
values=df.Data, aggfunc='first')
df1.columns = df1.columns.map('{0[0]}/{0[1]}'.format)
Out[382]:
Latitude 1/Longitude 2 Latitude 2/Longitude 4
Time
1 1.0 2.0
2 3.0 NaN