0

When I put a below condition for pandas dataframe:

if Df.loc[(Df['A']==1) & (Df['B'] == 'Yes')]:
    for i in range(len(Df['C'])):
        if Df['C'][i]>=1:
            Df['X'][i]= Df['D'][i]
        else:
            Df['X'][i] = (1-(Df['C'][i]))*(Df['D'][i])
    i=i+1

I get an error as:

The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

loki
  • 976
  • 1
  • 10
  • 22
Ashwin J
  • 9
  • 4

1 Answers1

0

Maybe, something like this might work -

import pandas as pd, numpy as np
df = pd.DataFrame({'A':[1,1,1,1,1,2,2,2], \
               'B':['Yes', 'Yes', 'Yes', 'Yes', 'No', 'No', 'Yes', 'Yes'], \
               'C':[3,1,0.3,4,0.5,0.4,0.2,10]})
df['D'] = np.random.randint(10,20,size=8)
df #Dummy dataframe
    A   B   C     D
0   1   Yes 3.0   19
1   1   Yes 1.0   13
2   1   Yes 0.3   16
3   1   Yes 4.0   18
4   1   No  0.5   19
5   2   No  0.4   14
6   2   Yes 0.2   17
7   2   Yes 10.0  15

temp = df[(df['A'] == 1) & (df['B'] == 'Yes')].copy()
temp
    A   B   C   D
0   1   Yes 3.0 19  
1   1   Yes 1.0 13
2   1   Yes 0.3 16
3   1   Yes 4.0 18

temp['X'] = np.where(temp['C'] >= 1, temp['D'], (1-temp['C'])*temp['D'])
    A   B   C   D   X
0   1   Yes 3.0 19  19.0
1   1   Yes 1.0 13  13.0
2   1   Yes 0.3 16  11.2
3   1   Yes 4.0 18  18.0

df = df.merge(temp[['X']], left_index=True, right_index=True, how='left')
df 
    A   B   C      D    X
0   1   Yes 3.0    19   19.0
1   1   Yes 1.0    13   13.0
2   1   Yes 0.3    16   11.2
3   1   Yes 4.0    18   18.0
4   1   No  0.5    19   NaN
5   2   No  0.4    14   NaN
6   2   Yes 0.2    17   NaN
7   2   Yes 10.0   15   NaN
Sajan
  • 1,247
  • 1
  • 5
  • 13
  • My question is under 1st condition "Df.loc[(Df['A']==1) & (Df['B'] == 'Yes')]" if the second condition of "Df['C'][i]>=1" is met then populate certain value, only if second condition is not me it should trigger else condition. – Ashwin J Apr 03 '20 at 18:41