3

我想用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。

4

3 回答 3

2

您可以使用掩码数组填充方法

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')
于 2013-04-09T22:07:02.600 回答
2

你的问题是 y1 不是字符串?你可以:a1.replace("nan", str(y1))

于 2013-04-09T21:44:18.223 回答
2

请记住,replace不会就地替换字符串,您必须执行以下操作:

a1 = a1.replace("nan", str(y1))
于 2013-04-09T21:49:49.420 回答