Victor
Victor

Reputation: 17087

Pandas truth value of a series is ambiguous

I have a pandas dataframe. I want to check the value in a particular column and create a flag column based on if it is null/not null.

df_have:

A     B
1     
2     X

df_want

A    B   B_Available
1          N
2    X     Y

I did:

def chkAvail(row):
    return (pd.isnull(row['B']) == False)

if (df_have.apply (lambda row: chkAvail(row),axis=1)):
    df_want['B_Available']='Y'

I got:

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

What did I do wrong?

Upvotes: 1

Views: 1744

Answers (3)

BENY
BENY

Reputation: 323226

By using np.where

df['B_Available']=np.where(df.B.eq(''),'N','Y')
df
Out[86]: 
   A  B B_Available
0  1              N
1  2  X           Y

Upvotes: 2

sacuL
sacuL

Reputation: 51335

You can also use np.select:

# In case blank values are NaN
df['B_Available'] = np.select([df.B.isnull()], ['N'], 'Y')

# In case blank values are empty strings:
df['B_Available'] = np.select([df.B == ''], ['N'], 'Y')

>>> df
   A    B B_Available
0  1  NaN           N
1  2    X           Y

Upvotes: 2

rafaelc
rafaelc

Reputation: 59274

You can use

df['B_available'] = df.B.notnull().map({False: 'N', True:'Y'})

If blank values are NaN or None. If they are whitespaces, do

df['B_available'] =  (df.B != ' ').map({False: 'N', True:'Y'})

To do if series is not a good idea because there might be many True and False in series. E.g. what does if pd.Series([True, False, True, True]) mean? Makes no sense ;)

Upvotes: 3

Related Questions