I have a df where i want to fill the rows in column values with True if the number of rows between values True in column values is less then two.
counter | values |
---|---|
1 | True |
2 | False |
3 | False |
4 | True |
5 | False |
6 | True |
7 | True |
8 | False |
9 | True |
10 | False |
11 | False |
The result i want is like the df below:
counter | values |
---|---|
1 | True |
2 | False |
3 | False |
4 | True |
5 | True |
6 | True |
7 | True |
8 | True |
9 | True |
10 | False |
11 | False |
CodePudding user response:
You can make groups starting with True, if the group is 2 items (or less), replace with True. Then compute the boolean OR with the original column:
N = 2
fill = df['values'].groupby(df['values'].cumsum()).transform(lambda g: len(g)<=N)
df['values'] = df['values']|fill ## or df['values'] |= fill
output (here as new column value2 for clarity):
counter values values2
0 1 True True
1 2 False False
2 3 False False
3 4 True True
4 5 False True
5 6 True True
6 7 True True
7 8 False True
8 9 True True
9 10 False False
10 11 False False
Other option that works only in the particular case of N=2
, check if both the row before and after is True:
df['values'] = df['values']|(df['values'].shift()&df['values'].shift(-1))