[英]value error for simple definition to generate list of colors
我正在做一个简单的定义,根据一些时间间隔返回 colors 的列表。 不幸的是,我不断收到以下错误:
ValueError:Series 的真值不明确。 使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。
我已经看到了关于 stackoverflow 的以下讨论,但只是尝试使其工作失败。
Series 的真值是不明确的。 使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()
这是我的代码:
y = 5
std = pd.Series([1,1,1,1])
values = pd.Series([2, 4, 6, 8])
colors = []
def colorbybar():
for i in values:
if y < (values - (2*std)):
colors[i] = 'darkblue'
elif y < (values - std):
colors[i] = 'blue'
elif y < values:
colors[i] = 'white'
elif y < (values + std):
colors[i] = 'red'
elif y < (values + (2*std)):
colors[i] = 'darkred'
return colors
colorbybar()
当您执行y < (values - std)
时,它将返回pd.Series
>>> y < (values - std)
0 False
1 False
2 False
3 True
dtype: bool
但在这里你需要标量bool
条件,如错误使用中所说
ValueError:Series 的真值不明确。 使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。
喜欢
>>> (y < (values - std)).all()
False
>>> # or
>>> (y < (values - std)).any()
True
因此,您的 function 将是
def colorbybar():
for i in values:
if (y < (values - (2*std))).all():
colors[i] = 'darkblue'
elif (y < (values - std)).all():
colors[i] = 'blue'
elif (y < values).all():
colors[i] = 'white'
elif (y < (values + std)).all():
colors[i] = 'red'
elif (y < (values + (2*std))).all():
colors[i] = 'darkred'
return colors
我猜你还没有完全理解 Python 的for
工作原理。 它不引入任何索引(像许多其他语言一样),而是迭代成员(像许多语言中的foreach
)。
在您的循环中,您正在尝试对values
进行算术运算,即整个系列,如Dishin 演示的那样。 您可能想对values
的项目进行操作。 您在for
语句中引入了变量i
,但让我选择名称value
来表达它的作用:
for value in values:
if y < (value - (2*std)):
# and so on
这同样适用于作为序列的std
。 一次迭代两个序列的最简单方法似乎是zip()
:
for value, std_item in zip(values, std):
if y < (value - (2*std_item)):
另一个问题是您试图将i
用作列表colors
的新创建项目的索引(键)。 这对于列表是不可能的。 您可以使用字典以这种方式设置键,但根据您的描述,这可能不是您想要的(从原始问题的存档版本判断):
我正在尝试根据值是否在某个间隔之间来创建一个返回 colors 列表的定义。 因此,如果 y 为 -1,则应返回列表 [darkblue, darkblue, darkblue, darkblue],但如果 y 为 11,则应返回列表 [darkred, darkred, darkred, darkred]。
而不是错误的语法colors[i] = 'darkblue'
,您可以使用colors.append('darkblue')
等。
顺便说一句,如果values
中的某个项目超出了所有限制,该怎么办? 不应该也有颜色吗?
这是结果:
y = 5
std = pd.Series([1,1,1,1])
values = pd.Series([2, 4, 6, 8])
colors = []
def colorbybar():
for value, std_item in zip(values, std):
if y < (value - (2*std_item)):
colors.append('darkblue')
elif y < (value - std_item):
colors.append('blue')
elif y < value:
colors.append('white')
elif y < (value + std_item):
colors.append('red')
elif y < (value + (2*std_item)):
colors.append('darkred')
else: # added myself
colors.append('black')
return colors
colorbybar()
正如斯塔克所指出的,您的 function ( def
) 还有更多需要改进的地方。 正如它目前所写的那样,它只会按预期工作一次,尽管函数通常会重复工作。 当您再次调用它时,它将重用现有的全局变量,包括colors
。 在您的情况下, y
、 std
和values
应该是参数,而colors
应该是最后返回的局部变量。 这样您的 function 将很容易重复使用。
def colorbybar(y, std, values):
colors = []
for value, std_item in zip(values, std):
if y < (value - (2*std_item)):
colors.append('darkblue')
elif y < (value - std_item):
colors.append('blue')
elif y < value:
colors.append('white')
elif y < (value + std_item):
colors.append('red')
elif y < (value + (2*std_item)):
colors.append('darkred')
else: # added myself
colors.append('black')
return colors
colorbybar(5, pd.Series([1,1,1,1]), pd.Series([2, 4, 6, 8]))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.