2017-08-28 22 views
1

forループ内のカウンタ変数を正しくインクリメントする際に問題が発生しています。forループ内のインクリメントカウンタ

私はflagという変数を持っていて、flagの値に基づいてnumという新しい変数を作成したいとします。

入力:

'flag' 
FALSE 
TRUE 
TRUE 
TRUE 
FALSE 
TRUE 
FALSE 
TRUE 
TRUE 

所望の出力:

'flag' 'num' 
FALSE 1 
TRUE 1 
TRUE 1 
TRUE 1 
FALSE 2 
TRUE 2 
FALSE 3 
TRUE 3 
TRUE 3 

目標は1でNUMカウンタを起動し、別のFalseインスタンスがflag列に発生するまで1にそのカウンタを維持することです。これはdfの終わりまで続けられるでしょう。

マイコード:

def num(z): 
    i = 0 
    for x in range (0,len(z)): 
     if z['flg'] == False: 
      return i + 1 
     else: 
      return i 

df['num']=df.apply(num, axis=1) 

私は多くの場所でIカウンタをインクリメントしようとしているが、場合運...

+0

'z ['flg']'は常に同じものを返します。あなたのループは影響を与えません。 –

+0

また、 'x'を使って' z'を索引付けすることを意図していた場合、その長さではなく、 'z.keys()'を繰り返し処理します。そして、あなたはループの中に戻るべきではありません。あなたは 'i = i + 1'を実行してループの最後に戻るべきです – user1999728

答えて

8
df['num'] = (~df['flag']).cumsum() 

はそのFalse = 0True == 1

事実を使用していますdf['num']は、True値とFalse値の列ではなく、文字列の列です。変更するか、またはテストをに変更することをお勧めしますここ

+0

非常に良い解決策です;) – jezrael

+0

非常に簡単な解決策もあります。 – Dark

0

はあなたのコードを修正問題であるが、マーティン・ファーブルによって溶液は進歩して:

def num(z): 
    i = 0 
    numcol = [] 
    for flag in z: 
     if not flag: 
      i += 1 
     numcol.append(i) 
    return numcol 

df['num'] = num(df['flag']) 

最初に私は、発電機でそれをやってみたかったが、私はそれがで動作するように取得していませんパンダのデータフレーム