Python 熊猫/小熊猫阵列填充

Python 熊猫/小熊猫阵列填充,python,pandas,numpy,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,

我有一个从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有68M行,处理起来要花很多时间,所以我想知道是否还有另一种更通俗、更快速的方法来实现这一点。

假设您的
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
更新:如果fillvalue不是零,则必须修改上述内容

方法1:将第二行替换为(请记住,仅当坐标唯一时才应使用此选项):

方法2:不起作用

方法3:创建
spM
do后

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

你能提供一份详细的报告吗?现在还不清楚你想在这里做什么,我想你想要,然后用
array2string
将输出写入一个文本文件,你到底想用矩阵解什么?明智的方法可能是将矩阵保存在内存中,而不是写入磁盘。如果68M行是矩阵的扁平表示,那么它是~8250个点,这已经相当大了。我编辑了问题,我需要将其写入磁盘,因为我需要的是特定格式的文件,而不是矩阵本身。我将检查解决方案用户3483203。保罗,tks!它几乎就在那里,但是,我不能对重复的值求和,因为它将使相应的值加倍。取而代之的是,我需要删除其中一行。@MauroAssis如果具有相同坐标的所有行也具有相同的值,并且您不想计算它们的多重性,那么您可以实际使用方法1。因为在这种情况下,赋值顺序没有定义并不重要。Paul,事实上,我检查了,只有一个重复的值,所以我想我会保留方法三。非常感谢你!
>>> spM.sum_duplicates()
>>> assert spM.has_canonical_format
>>> spM.data -= fillvalue
>>> result2 = spM.A + fillvalue