2013-04-09 131 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