我有相同的代码,我正在尝试在简单条件下在pandas数据框架中创建新字段:
if df_reader['email1_b']=='NaN':
df_reader['email1_fin']=df_reader['email1_a']
else:
df_reader['email1_fin']=df_reader['email1_b']
ValueError Traceback (most recent call last)
<ipython-input-92-46d604271768> in <module>()
----> 1 if df_reader['email1_b']=='NaN':
2 df_reader['email1_fin']=df_reader['email1_a']
3 else:
4 df_reader['email1_fin']=df_reader['email1_b']
/home/user/GL-env_py-gcc4.8.5/lib/python2.7/site-packages/pandas/core/generic.pyc in __nonzero__(self)
953 raise ValueError("The truth value of a {0} is ambiguous. "
954 "Use a.empty, a.bool(), a.item(), a.any() or a.all()."
--> 955 .format(self.__class__.__name__))
956
957 __bool__ = __nonzero__
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
任何人都可以解释我,我需要这个吗?
答案 0 :(得分:4)
df_reader['email1_b']=='NaN'
是布尔值的向量(每行一个),但是if
需要一个布尔值才能工作。请改用:
df_reader['email1_fin'] = np.where(df_reader['email1_b']=='NaN',
df_reader['email1_a'],
df_reader['email1_b'])
作为旁注,您确定'NaN'
吗?不是NaN
吗?在后一种情况下,您的表达式应为:
df_reader['email1_fin'] = np.where(df_reader['email1_b'].isnull(),
df_reader['email1_a'],
df_reader['email1_b'])
答案 1 :(得分:1)
if
期望返回一个标量值,它不会理解一系列布尔值,这些布尔值是由条件返回的。如果您考虑一下,如果此数组中的单个值为False
/ True
,该怎么办?
要正确执行此操作,您可以执行以下操作:
df_reader['email1_fin'] = np.where(df_reader['email1_b'] == 'NaN', df_reader['email1_a'], df_reader['email1_b'] )
您似乎也在与str
'NaN'
进行比较,而不是数字NaN
是否有此意图?