Панда / заполнение массива - PullRequest
0 голосов
/ 12 июня 2018

У меня есть фрейм данных Pandas, который я читаю из csv и содержит координаты X и Y и значение, которое мне нужно поместить в матрицу и сохранить в текстовом файле.Итак, я создал массив NumPy с расширениями max (X) и max (Y).

У меня есть этот файл:

fid,x,y,agblongo_tch_alive
2368458,1,1,45.0126083457747
2368459,1,2,44.8996854102889
2368460,2,2,45.8565022933761
2358154,3,1,22.6352522929758
2358155,3,3,23.1935887499899

И мне нужен этот:

   45.01    44.89 -9999.00    
-9999.00    45.85 -9999.00
   22.63 -9999.00    23.19

Для этого я использую цикл, подобный следующему:

for row in data.iterrows():
    p[int(row[1][2]),int(row[1][1])] = row[1][3]

, а затем сохраняю его на диск с помощью np.array2string .Это работает.

Поскольку исходный CSV имеет 68 M строк, обработка занимает много времени, поэтому мне интересно, есть ли другой более питонский и быстрый способ сделать это.

1 Ответ

0 голосов
/ 12 июня 2018

Предполагая, что столбцы вашего df равны 'x', 'y', 'value', вы можете использовать расширенное индексирование

>>> x, y, value = data['x'].values, data['y'].values, data['value'].values
>>> result = np.zeros((y.max()+1, x.max()+1), value.dtype)
>>> result[y, x] = value

Это, однако, не будет работать должным образом, если координаты неуникальный.В этом случае безопаснее (но медленнее) использовать add.at:

>>> result = np.zeros((y.max()+1, x.max()+1), value.dtype)
>>> np.add.at(result, (y, x), value)

В качестве альтернативы, вы можете создать разреженную матрицу, поскольку ваши данные оказываются в разреженном формате coo.Используя свойство '.A', вы можете затем преобразовать его в обычный (плотный) массив по мере необходимости:

>>> from scipy import sparse
>>> spM = sparse.coo_matrix((value, (y, x)), (y.max()+1, x.max()+1))
>>> (spM.A == result).all()
True

Обновление : если значение заполнения не равно нулю, вышеприведенное необходимо изменить.

Метод 1: заменить вторую строку на (помните, что это следует использовать только в том случае, если координаты уникальны):

>>> result = np.full((y.max()+1, x.max()+1), fillvalue, value.dtype)

Метод 2: не работает

Метод 3: после создания spM do

>>> spM.sum_duplicates()
>>> assert spM.has_canonical_format
>>> spM.data -= fillvalue
>>> result2 = spM.A + fillvalue
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...