2017-08-28 118 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櫃檯,並保持該計數器在1至另一False例如在flag列發生。這將持續到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) 

我試圖增加在許多地方,我反擊,但沒有運氣...

+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值的列,而是一列字符串,我建議您更改該值,或將測試更改爲df['num'] = (df['flag'] == 'FALSE').cumsum()

+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']) 

起初我想用一臺發電機做到這一點,但我沒有得到它一起工作熊貓數據框。