Как изменить структуру данных pandas по значениям столбцов? - PullRequest
4 голосов
/ 10 октября 2019

У меня есть фрейм данных со столбцами, которые включают широту, долготу, время и значения данных. Я хотел бы изменить его и преобразовать в массив данных 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по уникальным комбинациям lat / long, сохраняя каждую как xarray, а затем объединяя их по измерению lat / long.

Есть ли способы повысить эффективность преобразования данных?

Ответы [ 2 ]

5 голосов
/ 10 октября 2019

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
1 голос
/ 10 октября 2019

Это просто классическая сводная таблица с настройкой по столбцам. Как @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
...