laszlopanaflex
laszlopanaflex

Reputation: 1916

conditionally fill all subsequent values of dataframe column

i want to "forward fill" the values of a new column in a DataFrame according to the first instance of a condition being satisfied. here is a basic example:

import pandas as pd
import numpy as np

x1 = [1,2,4,-3,4,1]

df1 = pd.DataFrame({'x':x1})

i'd like to add a new column to df1 - 'condition' - where the value will be 1 upon the occurrence of a negative number,else 0, but i'd like the remaining values of the column to be set to 1 once the negative number is found

so, i would look for desired output as follows:

    condition   x
0   0   1
1   0   2
2   0   4
3   1   -3
4   1   4
5   1   1

Upvotes: 3

Views: 124

Answers (3)

DSM
DSM

Reputation: 353019

No one's used cummax so far:

In [165]: df1["condition"] = (df1["x"] < 0).cummax().astype(int)

In [166]: df1
Out[166]: 
   x  condition
0  1          0
1  2          0
2  4          0
3 -3          1
4  4          1
5  1          1

Upvotes: 3

jpp
jpp

Reputation: 164623

You can use Boolean series here:

df1['condition'] = (df1.index >= (df1['x'] < 0).idxmax()).astype(int)

print(df1)

   x  condition
0  1          0
1  2          0
2  4          0
3 -3          1
4  4          1
5  1          1

Upvotes: 1

Vishnu Kunchur
Vishnu Kunchur

Reputation: 1726

Using np.cumsum:

df1['condition'] = np.where(np.cumsum(np.where(df1['x'] < 0, 1, 0)) == 0, 0, 1)

Output:

   x  condition
0  1          0
1  2          0
2  4          0
3 -3          1
4  4          1
5  1          1

Upvotes: 1

Related Questions