ValueError(在python中创建函数时):Series的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all() [重复]

Posted

技术标签:

【中文标题】ValueError(在python中创建函数时):Series的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all() [重复]【英文标题】:ValueError (while creating a function in python): The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all() [duplicate] 【发布时间】:2019-03-26 03:51:45 【问题描述】:
def function(df):
    if (df['Total'] > 0) & (df['Total'] <= 50000):
         df['X'] = (df['Total']*(2/150)) * 0.2
    elif (df['Total'] > 50000):
        df['X'] = ((50000*(2/150))*0.2) + ((df['Total']-50000)*(2/150)*0.2)

我正在尝试运行上述代码,但得到一个值错误提示

File "<ipython-input-31-f77514d81c6f>", line 1, in <module>
    platinumplus(cust_spends)

File "<ipython-input-30-da2fd213761f>", line 2, in platinumplus
    if (df['Total'] > 0) & (df['Total'] <= 50000):

File "E:\ProgramData\Anaconda3\lib\site-packages\pandas\core\generic.py", 
    line 1573, in __nonzero__ .format(self.__class__.__name__))

ValueError:Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。

【问题讨论】:

你能告诉我们堆栈跟踪吗? 能否展示一下数据集? 请检查df['Total'] 类型是否为浮点型。可能是字符串 文件“”,第 1 行,在 Platinumplus(cust_spends) 文件“”,第 2 行,在 Platinumplus if (df['Total'] > 0) & (df['Total'] nonzero .format(self.__class__.__name__)) ValueError: Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。 @Abhaykumar 那你能把它贴在问题上,编辑然后添加吗? 【参考方案1】:

我认为问题出在您的if 声明中。 (df['Total'] &gt; 0) &amp; (df['Total'] &lt;= 50000) 将返回一个布尔系列而不是单个 TrueFalse 所以 python 不知道如何处理这个问题。如果您希望系列中的所有值为True,您可以使用:

((df['Total'] &gt; 0) &amp; (df['Total'] &lt;= 50000)).all()

【讨论】:

它部分工作,第二个循环不工作。 所以我认为这个答案解决了错误的根源(你必须在你的第二个 if 语句中使用相同的逻辑)。但是,看起来这可能没有达到您的预期 - 根据它们在系列中的评估方式设置值,我建议您使用 numpy.where 查看解决方案【参考方案2】:

我相信您需要numpy.where 来通过布尔掩码设置列的新值:

df = pd.DataFrame('Total':[10, 10000, 40000, 100])

def function(df):
    mask = (df['Total'] > 0) & (df['Total'] <= 50000)
    v1 = (df['Total']*(2/150)) * 0.2
    v2 = ((50000*(2/150))*0.2) + ((df['Total']-50000)*(2/150)*0.2)

    df['X'] = np.where(mask, v1, v2)
    return df

df1 = df.pipe(function)
print (df1)
   Total           X
0     10    0.026667
1  10000   26.666667
2  40000  106.666667
3    100    0.266667

如果有多个条件使用numpy.select:

df = pd.DataFrame('Total':[10, 10000, 40000, 100, -2])


def function(df):
    mask1 = (df['Total'] > 0) & (df['Total'] <= 50000)
    mask2 = df['Total'] > 50000
    v1 = (df['Total']*(2/150)) * 0.2
    v2 = ((50000*(2/150))*0.2) + ((df['Total']-50000)*(2/150)*0.2)

    df['X'] = np.select([mask1, mask2], [v1, v2], default=np.nan)
    return df

df1 = df.pipe(function)
print (df1)
   Total           X
0     10    0.026667
1  10000   26.666667
2  40000  106.666667
3    100    0.266667
4     -2         NaN

【讨论】:

如果还有一个 elif 条件怎么办? @Abhaykumar - 添加了解决方案。如果新的 elif 条件创建新的布尔掩码和新值 mask3v3 @jpp - 我同意,谢谢。 @Abhaykumar - 欢迎您!您也可以接受我的解决方案。要将答案标记为已接受,请单击答案旁边的复选标记以将其从空心切换为绿色 (see screenshot)。谢谢。

以上是关于ValueError(在python中创建函数时):Series的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all() [重复]的主要内容,如果未能解决你的问题,请参考以下文章

ValueError:长度不匹配:在熊猫数据框中创建分层列时,预期的轴有 0 个元素

使用cppyy时如何在python中创建子类?

在 Python 3.4 中创建凯撒密码程序,但函数不起作用

在 Python 中创建点类

如何在 Python 中创建多个构造函数? [复制]

无法在 azure 函数应用程序中创建 python 函数