我想用python替换文本中每列的平均值来替换缺失的数据点。
所以,我的想法是:
- 从文本文件 中读取每一列
- 计算每一列的平均值
- 将nan替换为每列的计算平均值
- 将它们写回一个新的文本文件
我认为我可以到第二步,但我有一个麻烦的第三步和第四步。我的代码如下:
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
我想用每列的平均值替换这些nan
请记住,replace
不会就地替换字符串,您必须这样做:
a1 = a1.replace("nan", str(y1))
你的问题是y1不是字符串?你可以输入: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. savetext:
np.savetxt(filename, masked_arr.filled(means), fmt='%0.2f')