【问题标题】:value error for simple definition to generate list of colors简单定义的值错误以生成颜色列表
【发布时间】:2020-08-26 23:56:49
【问题描述】:

我正在做一个简单的定义,以根据一些间隔返回颜色列表。不幸的是,我不断收到以下错误:

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

我看过以下关于 stackoverflow 的讨论,但只是尝试使其工作失败。

Truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or 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()

【问题讨论】:

  • 如果您的original question 没有有意义的答案,请不要post your question again。下次,编辑原始问题以改进它。
  • colors 已经是一个全局变量。您无需退货。
  • 有任何答案解决了您的问题吗?请acceptit (✓) 或通过editing 或 cmets 阐明您的需求。也可以upvote(▲)有用的答案。

标签: python pandas definition valueerror


【解决方案1】:

我猜你还没有完全理解 Python 的 for 是如何工作的。它不引入任何索引(就像在许多其他语言中一样),但会迭代成员(例如在许多语言中的foreach)。

在您的循环中,您尝试对values(即整个系列)进行算术运算,如Dishin demonstrated。您可能想对valuesitems 进行操作。您在for 语句中引入了变量i,但让我选择名称value 来表达它的作用:

for value in values:
    if y < (value - (2*std)):
    # and so on

这同样适用于std,它也是一个序列。 iterate two sequences at once 最简单的方法似乎是zip()

for value, std_item in zip(values, std):
    if y < (value - (2*std_item)):

另一个问题是您试图使用i 作为colors 列表中新创建项目的索引(键)。这对于列表是不可能的。您可以使用字典以这种方式设置键,但根据您的描述,这可能不是您想要的(从archived version of the original question 判断):

我正在尝试根据值是否在某个间隔之间来创建一个返回颜色列表的定义。因此,如果 y 为 -1,它应该返回列表 [darkblue,darkblue,darkblue,darkblue],但如果 y 是 11,它应该返回列表 [darkred,darkred,darkred,darkred]。

你可以使用colors.append('darkblue')等来代替错误的语法colors[i] = '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()

作为stark pointed out,您的功能还有更多需要改进的地方(def)。正如目前所写的那样,它只会按预期工作一次,尽管函数通常会重复工作。当你再次调用它时,它会重用现有的全局变量,包括colors。在您的情况下,ystdvalues 应该是参数,colors 应该是最后返回的局部变量。这样您的函数将很容易重复使用。

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]))

【讨论】:

    【解决方案2】:

    当您执行y &lt; (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
    

    因此您的功能将是

    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
    

    【讨论】:

    • 感谢您的快速回复!错误消失了,但它返回一个空列表..
    • 我不知道您的逻辑,我的意思是您必须根据预期输出使用allany
    猜你喜欢
    • 2018-04-24
    • 2021-03-31
    • 2013-11-13
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    • 2020-04-04
    • 1970-01-01
    • 2021-04-27
    相关资源
    最近更新 更多