繁体   English   中英

生成 colors 列表的简单定义的值错误

[英]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 在您的情况下, ystdvalues应该是参数,而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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM