2015-05-03 105 views
2

我有一個文本文件中的窗體的數據。如何列堆棧數組忽略nan在Python中?

文本文件條目

#x y z 
1 1 1 
2 4 
3 9 
4 16 
5 25 
6 36 
7 49 
8 64 512 
9 81 729 
10 100 1000 
11 121 
12 144 1728 
13 169 
14 196 
15 225 
16 256 4096 
17 289 
18 324 
19 361 6859 
20 400 
21 441 9261 
22 484 
23 529 12167 
24 576 
25 625 

一些在第三列中的條目是空的。我正在嘗試創建一個x(第1列)和z(第3列)數組忽略nan。讓陣列是B. B的內容應該是:

1 1 
8 512 
9 729 
10 1000 
12 1728 
16 4096 
19 6859 
21 9261 
23 12167 

我嘗試使用代碼這樣做:

import numpy as np 
A = np.genfromtxt('data.dat', comments='#', delimiter='\t') 
B = [] 
for i in range(len(A)): 
    if ~ np.isnan(A[i, 2]): 
     B = np.append(B, np.column_stack((A[i, 0], A[i, 2]))) 
print B.shape 

這是行不通的。它創建一個列向量。這怎麼可以在Python中完成?

+1

如果你將處理的數據分析,'Pandas'將使生活用'pd.read_table(文件).dropna()''這裏pd.read_table(文件)'更容易閱讀文件和'dropna()'放下'NA'行。 – Zero

回答

0

使用pandas將使你的生活很容易(注意正則表達式來定義delimiter):

from pandas import read_csv 

data = read_csv('data.dat', delimiter='\s+').values 

print(data[~np.isnan(data[:, 2])][:, [0, 2]]) 

導致:

array([[ 8.00000000e+00, 5.12000000e+02], 
     [ 9.00000000e+00, 7.29000000e+02], 
     [ 1.00000000e+01, 1.00000000e+03], 
     [ 1.20000000e+01, 1.72800000e+03], 
     [ 1.60000000e+01, 4.09600000e+03], 
     [ 1.90000000e+01, 6.85900000e+03], 
     [ 2.10000000e+01, 9.26100000e+03], 
     [ 2.30000000e+01, 1.21670000e+04]]) 
0

如果你讀你data.dat文件,指定內容給一個變量,說data

B=[] 
for line in data.split('\n'): 
    if len(line.split()) == 3: 
     x,y,z = line.split() 
     B.append((x,z)) # or B.append(str(x)+'\t'+str(z)+'\n') 
         # or any othr format you need 
0

您可以通過行迭代,分裂他們,只處理有3個要素的那些

並非所有庫提供的功能都易於使用,正如您發現的那樣。下面的程序手動執行它,並使用數據文件中的值創建一個數組。

import numpy as np 

def main(): 
    B = np.empty([0, 2], dtype = int) 
    with open("data.dat") as inf: 
     for line in inf: 
      if line[0] == "#": continue 
      l = line.split() 
      if len(l) == 3: 
       l = [int(d) for d in l[1:]] 
       B = np.vstack((B, l)) 

    print B.shape 
    print B 

    return 0 

if __name__ == '__main__': 
    main() 

需要注意的是:

1)append()功能適用於列表,而不是陣列 - 至少不會在你使用的語法。擴展數組的最簡單方法是使用vstack(或hstack作爲列)「堆積」行。

2)在genfromtxt()中指定分隔符可能會讓你咬。默認情況下,分隔符是任何你想要的空白。

0

從您的輸入數據幀:

In [33]: df.head() 
Out[33]: 
    x y z 
0 1 1 1 
1 2 4 NaN 
2 3 9 NaN 
3 4 16 NaN 
4 5 25 NaN 

..你可以通過doin得到輸出數據幀B克這種:

In [34]: df.dropna().head().drop('y', axis=1) 
Out[34]: 
    x  z 
0 1  1 
7 8 512 
8 9 729 
9 10 1000 
11 12 1728