2017-08-28 86 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']) 

起初我想用一台发电机做到这一点,但我没有得到它一起工作熊猫数据框。