簡體   English   中英

用平均值代替納米

[英]Replacing nan with mean

我想用python用文本中每列的平均值替換缺失的數據點。

所以,我的想法是:

  1. 從文本文件中讀取每列
  2. 計算每列的平均值
  3. 將nan替換為每列中的計算平均值
  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)

正如您所看到的,此處的問題與使用'replace'命令將nan替換為mean有關,因為它只處理字符串。 我將非常感謝任何幫助或建議。 我的部分數據如下所示

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

我想用每列中的平均值替換那些nans。

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

請記住, replace 替代原地的,你必須做這樣的事情的字符串:

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

你可以使用蒙面數組填充方法

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')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM