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']
类型是否为浮点型。可能是字符串
文件“我认为问题出在您的if
声明中。 (df['Total'] > 0) & (df['Total'] <= 50000)
将返回一个布尔系列而不是单个 True
或 False
所以 python 不知道如何处理这个问题。如果您希望系列中的所有值为True
,您可以使用:
((df['Total'] > 0) & (df['Total'] <= 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 条件创建新的布尔掩码和新值mask3
和 v3
。
@jpp - 我同意,谢谢。
@Abhaykumar - 欢迎您!您也可以接受我的解决方案。要将答案标记为已接受,请单击答案旁边的复选标记以将其从空心切换为绿色 (see screenshot)。谢谢。以上是关于ValueError(在python中创建函数时):Series的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all() [重复]的主要内容,如果未能解决你的问题,请参考以下文章
ValueError:长度不匹配:在熊猫数据框中创建分层列时,预期的轴有 0 个元素