2013-04-09 132 views
3

我想用python中的每一列代替丟失的數據點。用平均值代替nan

所以,我的想法是:

  1. 閱讀從文本文件中的每一列
  2. 計算各列
  3. 在每列與計算的平均替換楠的平均
  4. 把它們寫回新的文本文件

我認爲我可以直到第2步,但是我對第3步和第4步有困難。 我的代碼如下;

for columns in (raw.strip().split() for raw in f): 
    a.append(columns[c]) 
    x = np.array(a, float) 
    y = np.ma.masked_array(x,np.isnan(x)) 
    y1 = np.mean(y) 
    a1 = ' '.join(a) 
    a1.replace("nan", "y1") 
    f1 = open("practice.txt", "w") 
    f1.write(a1) 

正如你可以看到,這裏的問題是關係到均值與「替換」命令替換楠,因爲它是隻處理字符串。 我會很感激任何幫助或建議。 我的數據的部分看起來像下面

1.60566 nan 2.00755 2.32407 
1.502 nan 1.36522 1.555 
0.63333 nan 1.56102 2.08929 
nan nan 0.87451 1.06667 
2.5 nan 1.88889 1.0661 
3.88197 nan 3.0875 2.75909 
4.02692 nan 3.36154 3.92895 
5.9907 nan 5.29535 5.82245 
6.16111 2.67317 6.04074 6.25588 
6.88269 2.62241 5.43958 6.07 
5.92 2.48627 5.91818 6.75862 
6.93429 6.17333 7.34 7.76538 
8.25143 7.925 7.8087 8.725 
8.1025 8.19429 8.11563 8.80937 
8.12105 8.145 7.83889 8.37576 
7.47292 8.65 8.35536 8.61081 
8.10392 8.66032 8.74082 9.65484 
10.03036 10.74727 10.634 10.50961 

我想在每列平均值來替換那些NaN的。

+0

A1是在你的代碼串 – Antimony 2013-04-09 21:41:37

+1

能告訴你一個很小的數據文件來請解析一下? – chespinoza 2013-04-09 21:43:14

+0

是的,你是對的銻。 – Isaac 2013-04-09 21:44:28

回答

2

記住replace取代就地串,你必須做這樣的事情:

a1 = a1.replace("nan", str(y1)) 
+1

@Isaac歡迎你!如果這個或其他答案對你有幫助,請考慮[接受]( http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)通過點擊左邊的複選標記 - 這就是您在Stack Overflow中說「謝謝」的方式; ) – 2013-04-09 21:55:45

+0

你有什麼想法寫出結果字符串,它是a1作爲新文本文件中的列而不是行嗎? – Isaac 2013-04-09 22:16:52

+0

不知道列的其他元素。你可以做的是存儲整個事物(所有的行和列)在一個矩陣(一個子列表,每個子列表都是一行)中,然後轉置該矩陣,並將結果逐行寫入 – 2013-04-09 22:21:35

2

你的問題是,y1不是一個字符串?你可以:a1.replace("nan", str(y1))

+0

謝謝你,我會嘗試 – Isaac 2013-04-09 21:51:16

1

你可以使用屏蔽數組filled method

import numpy as np 

filename = '/tmp/data' 
with open(filename, 'w') as f: 
    f.write(''' 
1 2 nan 
2 nan 3 
nan 3 4 
nan nan nan 
''') 

arr = np.genfromtxt(filename) 
print(arr) 
# [[ 1. 2. nan] 
# [ 2. nan 3.] 
# [ nan 3. 4.] 
# [ nan nan nan]] 

mask = np.isnan(arr) 
masked_arr = np.ma.masked_array(arr, mask) 
means = np.mean(masked_arr, axis=0) 

print(means) 
# [1.5 2.5 3.5] 

通過上述設置,

print(masked_arr.filled(means)) 

產量

[[ 1. 2. 3.5] 
[ 2. 2.5 3. ] 
[ 1.5 3. 4. ] 
[ 1.5 2.5 3.5]] 

然後,寫數組到一個文件,你可以使用np.savetxt

np.savetxt(filename, masked_arr.filled(means), fmt='%0.2f') 
+0

看起來非常有用!感謝unutbu!我現在就試試。 – Isaac 2013-04-09 22:18:57

+0

我有一個這個方法的問題,你似乎使用了字符串的行在f.write()裏面。我在文本文件中的字符串太大了。有沒有辦法在這個f.write()中使用我的全文本文件數據? – Isaac 2013-04-10 02:53:06

+0

'f.write'只用於在文件中創建一些數據。你已經有了你的數據在一個文件中。所以你可以跳過'f.write'部分。你的數據如此之大以至於'arr = np.genfromtxt(filename)'失敗? – unutbu 2013-04-10 06:18:11