Index range based on condition

Viewed 168

I have the pandas dataframe like below:

account   have  
  A         0     
  A         1     
  A         2     
  A         1     
  A         1     
  A         2     
  A         0     
  A         1     
  A         1     
  B         0     
  B         0     
  B         0     
  B         0     
  B         0     
  B         1     
  B         1     
  B         1     
  B         1  

I want to result like this:

  account   have  
  A         12    
  A         12    
  A         0     
  A         1     
  A         2     
  A         0     
  A         1     
  A         2     
  A         3     
  B         12    
  B         12    
  B         12    
  B         12    
  B         12    
  B         12    
  B         12    
  B         12    
  B         12   

I want to rank order after the specific value found and changed by account otherwise, it will return 12. For example, the specific value is 2, if any value that greater than or equal to 2 will be consider. In account A, it found 2 at index 2, the index will be change to 0 and any value after that less than 2 will be ranked order starting at 1.

In account B, there is no value greater than or equal to 2, the results return 12.

In fact, I have like a million account, if there is any suggestion or point to start of, please help me.

1 Answers

Use cumsum to find your groups, and cumcount to fill them in.


m = df["have"].ge(2).groupby(df["account"]).cumsum()
df.groupby([df["account"], m]).cumcount().where(m.ne(0), 12)

0     12
1     12
2      0
3      1
4      2
5      0
6      1
7      2
8      3
9     12
10    12
11    12
12    12
13    12
14    12
15    12
16    12
17    12
dtype: int64
Related