【问题标题】:How to reshape pandas dataframe by column values?如何按列值重塑熊猫数据框?
【发布时间】:2019-10-11 02:06:23
【问题描述】:

我有一个包含纬度、经度、时间和数据值的列的数据框。我想重塑它并将其转换为一个 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

我目前正在这样做,方法是对唯一的 lat/long 组合进行 for 循环,将每个组合保存为一个 xarray,然后将它们连接到 lat/long 维度上。

有什么方法可以更高效地重塑数据?

【问题讨论】:

  • pd.df.pivot() 或许可以为您节省一些时间。

标签: python pandas python-xarray


【解决方案1】:

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之前的pivot之前的预创作栏有创意 :) +1
【解决方案2】:

这只是带有自定义列的经典数据透视表。正如@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

【讨论】:

    猜你喜欢
    • 2020-12-27
    • 1970-01-01
    • 1970-01-01
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多