2017-07-21 7 views
0

タブ区切りの値が10000+以上の非常に大きなファイルがあります。私は、データの各行の平均を見つけて、これらの新しい値を新しいファイルに追加しようとしています。 Howveverでは、見つからなかった値は大きなファイルに-1として入力されます。私の平均を計算する際に-1の値を使用すると、データが乱れることがあります。これらの値をどのように除外することができますか?私のコードイムで-1を除いて計算する

"HsaEX0029886" 100 -1 -1 100 100 100 100 100 100 -1 100 -1 100 
"HsaEX0029895" 100 100 91.49 100 100 100 100 100 97.87 95.29 100 100 93.33 
"HsaEX0029923" 0 0 0 -1 0 0 0 0 0 9.09 0 5.26 0 

最後の3つの要素を取り、ちょうど3つの値の平均を見つける: 大きなファイル構造は次のようになります。行の最後の3つの要素は、85、12であり、-1ならば、私は85と12の平均値を返す必要がここに私の全体のコードは次のとおりです。

with open("PSI_Datatxt.txt", 'rt') as data: 
    next(data) 
    lis = [line.strip("\n").split("\t") for line in data]  # create a list of lists(each row) 
for row in lis: 
    x = float(row[11]) 
    y = float(row[12]) 
    z = float(row[13]) 
    avrg = ((x + y + z)/3) 
    with open("DataEditted","a+") as newdata: 
     if avrg == -1: 
      continue #skipping lines where all 3 values are -1 
     else: 
      newdata.write(str(avrg) + ' ' + '\n') 

感謝。明確化が必要な場合はコメントする。

+0

を行う必要がありますし、そのうち2つは-1です、私たちは何をしますか? -1を0に置き換えてavg = sum(row)/ 10するか、またはそれらを無視してavg = sum(row)/ 8を実行しますか? – jacoblaw

+0

インデントがオフです。また、なぜあなたは各列から1つの値を取るだけですか? –

+0

1)オープンした後にファイルを '探す '必要はありません。すでに始まりです。 2) 'with'節があなたのために行うので、2番目のファイルを閉じる必要はありません。 3)インデントがオフになっている可能性があります。現在の状態では、コードは1行の平均しか計算しません。 – ForceBru

答えて

1
data = [float(x) for x in row[1:] if float(x) > -1] 
    if data: 
     avg = sum(data)/len(data) 
    else: 
     avg = 0 # or throw an exception; you had a row of all -1's 

最初の行は、かなり標準Pythonismです...(この場合は行の)配列を指定し、リストを反復し、条件ビット場合、アレイ内のxについて使用してのものを除外することができます。

あなただけの最後の三つの値を見たい場合、あなたは最後の三つで何を意味するかに応じて、2つのオプションがあります。

data = [float(x) for x in row[-3:] if float(x) > -1] 

は、最後の3を見て、戻って3つの値にあなたに0を与えますそれらが-1かどうかによって異なります。

data = [float(x) for x in row[1:] if float(x) > -1][:-3] 

はここ

+0

x> -1は、有効な否定データを無視します。 –

+0

みんなありがとう、私はこれらを試してみよう! –

+0

@cᴏʟᴅssampleサンプルデータには、少なくとも-1と非負の数値しかないので、float(x)== -1とするのは嫌いです。 OPの場合:もう少し説明するために編集するつもりで、最後の値の質問を得るために – Foon

1

それはである(あなたは、ほぼすべての全部または-1指定された行のために持っている場合、それは3未満になります)、最後の「良い」値の3にあなたを与えるだろうあなたの元の質問と同じ書式。行がすべてゼロである場合は、エラーメッセージを書くためにあなたを提供しています、またはあなたが代わりにそれを無視して何も

with open("PSI_Datatxt.txt", 'r') as data: 
    for row in data: 
     vals = [float(val) for val in row[1:] if float(val) != -1] 
     with open("DataEditted","a+") as newdata: 
      try: 
       newdata.write(str(sum(vals)/len(vals)) + ' ' + '\n') 
      except ZeroDivisionError: 
       newdata.write("My Error Message Here\n") 
1

を書き込むことはできませんラインが10点の値である場合、これはそれに

import csv 


def average(L): 
    L = [i for i in map(float, L) if i != -1] 
    if not L: return None 
    return sum(L)/len(L) 


with open('path/to/input/file') as infile, open('path/to/output/file', 'w') as fout: 
    outfile = csv.writer(fout, delimiter='\t') 
    for name, *vals in csv.reader(infile, delimiter='\t'): 
     outfile.writerow((name, average(vals))