我有一个熊猫数据框。我想检查特定列中的值,并根据它是否为空/不为空创建一个标志列。
df_have:
A B
1
2 X
df_want
A B B_Available
1 N
2 X Y
我做到了:
def chkAvail(row):
return (pd.isnull(row['B']) == False)
if (df_have.apply (lambda row: chkAvail(row),axis=1)):
df_want['B_Available']='Y'
我知道了
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
我做错了什么?
答案 0 :(得分:3)
您可以使用
df['B_available'] = df.B.notnull().map({False: 'N', True:'Y'})
如果空白值为NaN
或None
。如果它们是空格,请
df['B_available'] = (df.B != ' ').map({False: 'N', True:'Y'})
执行if series
并不是一个好主意,因为可能有很多True
和False
串联。例如。 if pd.Series([True, False, True, True])
是什么意思?没有道理;)
答案 1 :(得分:2)
您也可以使用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
答案 2 :(得分:2)
通过使用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