4

For this table:

enter image description here

I would like to generate the 'desired_output' column. One way to achieve this maybe:

  1. All the True values from col_1 are transferred straight across to desired_output (red arrow)
  2. In desired_output, place a True value above any existing True value (green arrow)

Code I have tried:

df['desired_output']=df.col_1.apply(lambda x: True if x.shift()==True else False)

Thankyou

3 Answers3

5

You can chain by | for bitwise OR original with shifted values by Series.shift:

d = {"col1":[False,True,True,True,False,True,False,False,True,False,False,False]}
df = pd.DataFrame(d)

df['new'] = df.col1 | df.col1.shift(-1)
print (df)
     col1    new
0   False   True
1    True   True
2    True   True
3    True   True
4   False   True
5    True   True
6   False  False
7   False   True
8    True   True
9   False  False
10  False  False
11  False  False
jezrael
  • 822,522
  • 95
  • 1,334
  • 1,252
2

try this

df['desired_output'] = df['col_1']
df.loc[1:, 'desired_output'] = df.col_1[1:].values | df.col_1[:-1].values
print(df)
Kuldip Chaudhari
  • 1,112
  • 4
  • 8
1

In case those are saved as string. all_caps (TRUE / FALSE) Input:

   col_1
0   True
1   True
2   False
3   True
4   True
5   False
6   Flase
7   True
8   False

Code:

df['desired']=df['col_1']
for i, e in enumerate(df['col_1']):
    if e=='True':
        df.at[i-1,'desired']=df.at[i,'col_1']
df = df[:(len(df)-1)]
df

Output:

   col_1    desired
0   True    True
1   True    True
2   False   True
3   True    True
4   True    True
5   False   False
6   Flase   True
7   True    True
8   False   False
AtanuCSE
  • 8,832
  • 14
  • 74
  • 112
  • @AngusStevenson My answer will specially work if the values are saved as string. "TRUE"(similar to your image in the question), not "True". – AtanuCSE Aug 16 '20 at 18:18