如何根据列值重塑 Pandas 数据框?

4

我有一个包含纬度、经度、时间和数据值列的数据框。我想将其重塑并转换为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,然后在经纬度维度上将它们连接起来。

有没有更有效率的方法来重新塑造数据?


1
pd.df.pivot() 可能能够为您节省一些时间。 - Hugh_Kelley
2个回答

5

Pivot是您需要的,但首先您需要新的列名称:

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

在“透视”之前预先创建“col”列非常有创意 :) +1 - Andy L.

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接