2017-09-18 11 views
0

私はこのような小さなアルゴリズムを持っています。 whileループは進めることができません。i = 1

The flowchart

私は

import pandas as pd 
raw = pd.read_csv 

i = 0 
T = pd.DataFrame(columns = ['Values']) 
singleT = raw.mean() + raw.std() 
T = T.append(singleT, ignore_index=True) 

if i == 0: 
    raw = raw.where(raw<T.iloc[i,:]) 
    i += 1 

while True: 
    singleT = raw.mean() + raw.std() 
    T = T.append(singleT, ignore_index=True) 
    if T.iloc[i,:].values == T.iloc[i-1,:].values: 
     break 
    background = T.iloc[i,:].values 
else: 
    raw = raw.where(raw<T.iloc[i,:]) 
    i += 1 
    print ('iteration{:02}'.format(i)) 

しかしPythonでそれを符号化され、ループはパスI = 1を取得し、繰り返し続けるなかった、全T配列は、値I = 1で満たされています。私は自分のコードにいくつかの変更を加えましたが、まったく動作しませんでした。

この問題を解決する方法についてアドバイスをいただければ幸いです! はあなたに非常に多くの

編集をありがとう:あなたたちはelsewhileに属していることを確認するために提案されているよう私は、最後の4行のために一つのタブを挿入したが、今では、構文、無効なエラー

EDIT2があります。ここにありますこの問題の正しいコードは、無限ループに入りません。

i = 0 
T = pd.DataFrame(columns = ['Pulse counts']) 
singleT = raw.mean() + raw.std() 
T = T.append(singleT, ignore_index=True) 

if i == 0: 
    filtered = raw.where(raw<T.iloc[i,:]) 
    i += 1 

while True: 
    singleT = filtered.mean() + filtered.std() 
    T = T.append(singleT, ignore_index=True) 
    if T.iloc[i,:].values == T.iloc[i-1,:].values or T.iloc[i-1,:].values == 0: 
     background = T.iloc[i-1,:].values 
     break 
    else: 
     filtered = filtered.where(filtered<T.iloc[i,:]) 
     print ('iteration{}'.format(i)) 
    i += 1 
+4

壊れたインデントが本当の問題を隠すことができます。それを修正してください。 –

+1

'i'はどこで初期化されていますか?これは[mcve]ではありません –

+0

ええ、とても申し訳ありません、私は間違ったコードを貼り付けました。とはい、それは他の人の間違ったインデントによって失敗しましたが、私はまだそれを修正することができませんでした –

答えて

1

は、この方法を試してみてください:

import pandas as pd 
raw = pd.read_csv 

i = 0 
T = pd.DataFrame(columns = ['Values']) 
singleT = raw.mean() + raw.std() 
T = T.append(singleT, ignore_index=True) 

while True: 
    singleT = raw.mean() + raw.std() 
    T = T.append(singleT, ignore_index=True) 
    if T.iloc[i,:].values == T.iloc[i-1,:].values: 
     background = T.iloc[i,:].values 
     break  
    else: 
     raw = raw.where(raw<T.iloc[i,:]) 
     #i += 1 
     print ('iteration{:02}'.format(i)) 
    i += 1 
+0

それは動作します!しかし、T値が0になったときにループを止めず、代わりに無限にnan値を続けるという問題がありました。 これは質問よりも多少あるかもしれませんが、この問題に対するご提案はありますか? –

+0

無限ループを止めるには、 'else'の外側で' i + = 1'を使う必要があります。私の編集コードをチェックしてください。 –

+0

質問の修正コードを更新しました。ありがとうございました! –

1

あなたのインデントが正しければ、else一部:

else: 
    raw = raw.where(raw<T.iloc[i,:]) 
    i += 1 
    print ('iteration{:02}'.format(i)) 

ifには異なる意味を持つwhile、に属していません:ループはせずに終了した場合にのみ実行されますbreakに到達したときにフラグを定義する必要性を省くforで利用可能な、あまり知られていない機能)

so iは決してインクリメントされません:無限ループ。

+0

私はちょうどelse:からすべての行のための1つのタブを挿入しようとしましたが、それは無効な構文をもたらしました。 この部分は今のようになります。 'トゥルー中:' ' シングレット= raw.mean()+ raw.std()' ' T = T.append(一重、ignore_index =真)' ' T.場合値: 'break' ' background = T.iloc [i、:]。値 ' ' else: ' 'は、iloc [i、:]。values == T.iloc [i-1、 Pythonコードを貼り付けることを理解していることを理解しておいてください。 –

+0

()オンラインでのコメントはあまり有用ではありません... –

関連する問題