2017-08-28 8 views
0

次のコードは、入力ファイルの各列の平均を計算します。ファイルが平均値を歪めるnanの値になるまで動作します。ここでPython - 計算前のファイルから行をフィルタリングする

が私のコードです:

with open(biasfile, 'r') as f: 
    data = [map(float, line.split()) for line in f] 

num_rows = len(data) 
num_cols = len(data[0]) 

totals = num_cols * [0.0] 

for line in data: 
    for index in xrange(num_cols): 
     totals[index] += line[index] 

averages = [total/num_rows for total in totals] 
print averages 

これは、ファイルの一部です:

22.7061 5.4303 
32.2040 5.4364 
22.9982 5.4426 
nan 5.4487 
nan 5.4548 
nan 5.4610 

これが出力されます:

[nan, 3.1446607421875] 

私はnan値を無視したいと残りの値の平均を計算します。どうすればこのことができますか?

+0

あなたは[pandas](https://pandas.pydata.org/pandas-docs/stable/index.html)と[numpy](https://docs.scipy.org/doc/numpy/)をチェックアウトしてください。 index.html) – Quickbeam2k1

答えて

1

あなたはデータをフィルタリングするために、Pythonのリストの内包表記を使用することができます。

with open('file.txt') as file: 
    data = [line.split() for line in file] 
    data = [item for item in data if 'nan' not in item] 
    data = [map(float, item) for item in data] 

totals = len(data[0]) * [0.0] 

for item in data: 
    for k, n in enumerate(item): 
     totals[k] += n 

print([total/len(data) for total in totals]) 

別のアプローチ:

with open('file.txt') as file: 
    data = [line.split() for line in file] 
    data = [item for item in data if 'nan' not in item] 
    data = [map(float, item) for item in data] 

print([sum(d[k] for d in data)/len(data) for k in range(len(data[0]))]) 
+0

ありがとう!今それは仕事のようです! –

+0

2番目の列にのみ他の条件を追加したい場合はどうすればよいですか?たとえば、x> 2がカウントを停止し、ファイルの残りの部分を無視するとします。 @DanilSperansky –

+0

これで、平均計算ではなくデータに条件を入れて解決しました! –

0

あなたはデータフレームのAPIを使用してのような何かを行うことはできません。

dataFrame.map(x => if (!x.isNaN) x).avg 
+0

なぜそれほど問題を抱えているのですか? [mean](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.mean.html)デフォルトではスキップされます – Quickbeam2k1

+0

ああそうは見えませんでした!ありがとうございました – belka

関連する問題