系列的真值在数据帧中是模糊的

时间:2017-08-22 07:37:53

标签: python python-2.7 pandas

我有相同的代码,我正在尝试在简单条件下在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().

任何人都可以解释我,我需要这个吗?

2 个答案:

答案 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是否有此意图?