繁体   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