2017-06-16 197 views
-1

我有一個網格地圖,其中有175 * 175的網格塊,所以我的地圖中的網格塊的總數是30625.每個網格塊都有其座標信息和屬性值(x和y是座標,z是值)。因此,當我導出此映射的屬性值時,它將信息保存爲xyz(如示例數據集中所示,該示例假定網格塊爲10 * 10 )。但是隻有一部分網格塊有信息,而其他網格塊是空的(沒有值)。所以當我輸出信息時,結果給我的數據只有不到30625行(白色塊的xyz信息丟失)。我的問題是如何使用python彌補(填充)缺少的數據?Python:填充迭代數據集中的缺失數據

實施例的數據集:

X  Y  Z 
1  1  2559.26 
2  1  2559.36 
3  1  2117.882 
4  1  2038.34 
5  1  2115.24 
6  1  2884.25 
7  1  1235.25 
8  1  2994.53 
9  1  2445.23[enter image description here][1] 
10  1  2847.45 
1  2  2847.96 
2  2  2110.23 
3  2  2004.35 
6  2  2948.24 <-- Missing data 
9  2  2998.34 <-- Missing data 
10  2  2394.34 

See actual data set here

Missing cells 圖1:白色細胞是缺失數據

This is the map grid,it has 175*175 grid blocks.The white grid is the missing grid

[2]: https://i.stack.imgur.com/255MB.png

+2

我想你應該編輯這篇文章,使其更有意義。因爲作爲讀者,我甚至不能理解你的問題陳述。 –

+2

請澄清你的問題,幷包括一個代碼示例。 –

+0

對不清楚的聲明抱歉。我編輯了這篇文章,希望它能讓你理解我的問題。 –

回答

1

我不知道你要如何導入數據(熊貓,Numpy等),所以我不打算假設。

假設您已經將數據存儲在名爲data的Numpy數組中。

import numpy as np 
data = np.array([[1, 1, 2559.26], [2, 1, 2559.36], [3, 1, 2117.882], ...]) 

# Set dimensions (assumes square grid) 
dim = 10 

# Missing data value 
no_data = -9999 

# Assign data to vectors 
X = data[:,0].tolist() 
Y = data[:,1].tolist() 
Z = data[:,2].tolist() 

# Iterate over the vector X 
# If the modulo 10 of the index (which will cycle over 10), 
# falls out of order with the value of X at that index 
# (which also cycles over 10), then insert missing values 
for i in range(1, np.size(X)): 
    if (i % dim + 1) != int(X[i]): 
     X.insert(i, (i % dim + 1)) 
     Y.insert(i, Y[i]) 
     Z.insert(i, no_data) 

這是做什麼檢查X重複循環1-10。如果不是,則插入缺失的數字,將Y設置爲其自身週期中的當前位置,並將Z設置爲任意無數據值。

0

如果我複製你的數據樣本粘貼到一個文件,我可以genfromtxt加載:

In [1]: data = np.genfromtxt('stack44594239.txt',dtype=None,names=True) 
In [2]: data 
Out[2]: 
array([(1, 1, 2559.26), (2, 1, 2559.36), (3, 1, 2117.882), 
     (4, 1, 2038.34), (5, 1, 2115.24), (6, 1, 2884.25), 
     (7, 1, 1235.25), (8, 1, 2994.53), (9, 1, 2445.23), 
     (10, 1, 2847.45), (1, 2, 2847.96), (2, 2, 2110.23), 
     (3, 2, 2004.35), (6, 2, 2948.24), (9, 2, 2998.34), 
     (10, 2, 2394.34)], 
     dtype=[('X', '<i4'), ('Y', '<i4'), ('Z', '<f8')]) 

這是一維結構數組有3場。

現在使目標陣列:

In [3]: arr = np.zeros((10,2),float) 
In [5]: arr.fill(np.nan) 

它最初以0填充,但我可以用別的東西,如np.nan(一種常見的浮點填充值)填補。

然後我可以使用data字段填寫值與一個聲明:

In [7]: arr[data['X']-1,data['Y']-1] = data['Z'] 
In [8]: arr 
Out[8]: 
array([[ 2559.26 , 2847.96 ], 
     [ 2559.36 , 2110.23 ], 
     [ 2117.882, 2004.35 ], 
     [ 2038.34 ,  nan], 
     [ 2115.24 ,  nan], 
     [ 2884.25 , 2948.24 ], 
     [ 1235.25 ,  nan], 
     [ 2994.53 ,  nan], 
     [ 2445.23 , 2998.34 ], 
     [ 2847.45 , 2394.34 ]])