Pandas / numpy数组填充

时间:2018-06-11 21:13:01

标签: python pandas numpy

我是从csv读取的Pandas数据帧,包含X和Y坐标以及我需要放入矩阵并将其保存到文本文件中的值。所以,我创建了一个具有max(X)和max(Y)扩展名的numpy数组。

我有这个文件:

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 :(得分:0)

假设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

但是,如果coordiantes不是唯一的,那么这将无法正常工作。 在这种情况下,使用add.at更安全(但更慢):

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

或者,您可以创建稀疏矩阵,因为您的数据恰好是稀疏的CU格式。使用'.A'属性,您可以根据需要将其转换为普通(密集)数组:

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

更新:如果fillvalue不为零,则必须修改上述内容。

方法1:用第二行替换(记住只有坐标是唯一的时才使用):

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

方法2:不起作用

方法3:创建spM后执行

>>> spM.sum_duplicates()
>>> assert spM.has_canonical_format
>>> spM.data -= fillvalue
>>> result2 = spM.A + fillvalue