繁体   English   中英

ValueError:(使用熊猫样式时,“系列长度必须匹配才能进行比较”

[英]ValueError: ('Series lengths must match to compare' when Using Pandas Style

通过使用Pandas Style ,我试图突出显示已使用条件格式从数据帧(如下所示)(按行和按列)子集中的那些单元格:

在此处输入图片说明

例如,在对第0行和第1行以及“ Adam”和“ Gill”列的单元格进行子集设置之后,如果这些单元格的值大于相应的“目标值”,我要突出显示这些单元格,如果较小则将其突出显示为橙色。

但是,在运行代码时,我始终收到以下错误:

ValueError: ('Series lengths must match to compare', u'occurred at index 0'

我该怎么做才能解决此问题?

这是我的代码:

import pandas as pd

def AboveTarget(s): # For dataframe style
    green = s > df["Target"]
    orange = s < df["Target"]
    return ["background-color: #86f922" if v else "background-color: #faebde" if w else "background-color: white" for v, w in zip(green, orange)]

df = pd.DataFrame({"Adam": [99.1, 95.2, 83.1],
                   "Gill": [99.2, 96.1, 81],
                   "Louis": [60, 71.5, 99.1],
                   "Target": [99, 98, 95]
                  })

html = (df.style.\
        apply(AboveTarget, subset = pd.IndexSlice[0:1, ["Adam", "Gill"]], axis = 1)
       )

html

在AboveTarget中,您试图将一个名为spd.Series碰巧具有更少的元素...-与一个数据框df ,这就是为什么它不起作用的原因。

一种方法是执行以下操作:

def AboveTarget(s, df): # For dataframe style
    green = s > df.loc[s.name, "Target"]
    orange = s < df.loc[s.name, "Target"]
    return ["background-color: #86f922" if v 
            else "background-color: #faebde" if w 
            else "background-color: white" 
            for v, w in zip(green, orange)]

html = (df.style.\
        apply(AboveTarget, subset = pd.IndexSlice[0:1, ["Adam", "Gill", "Louis"]],
              axis=1, args=(df,))
       )

html

在此处输入图片说明

我将df作为参数传递。


我更喜欢的另一种方式是,它不需要复杂的IndexSlice且不需要将df作为额外参数传递,如下所示:

def AboveTarget(s):
    green = s > s['Target']
    orange = s < s['Target']
    return ["background-color: #86f922" if v 
            else "background-color: #faebde" if w 
            else "background-color: white" 
            for v, w in zip(green, orange)]

html = (df.style.\
        apply(AboveTarget, subset = pd.IndexSlice[0:1], axis=1)
       )

html

之所以有效,是因为Target既不是> Target也不是< Target所以它将获得white的背景色

通过使用subset您可以将切片的元素传递给功能AboveTarget 结合axis=1AboveTarget的参数s将是AboveTarget中的行,即索引为["Adam","Gill"] Pandas系列。 您无法将其与df["Target"]进行比较,后者是索引为[0,1,2]的系列。

你需要:

import pandas as pd

def AboveTarget(s): # For dataframe style
    green = s > s["Target"]
    orange = s < s["Target"]
    return ["background-color: #86f922" if v else "background-color: #faebde"\
        if w else "background-color: white" for v, w in zip(green, orange)]

df = pd.DataFrame({"Adam": [99.1, 95.2, 83.1],
               "Gill": [99.2, 96.1, 81],
               "Louis": [60, 71.5, 99.1],
               "Target": [99, 98, 95]
              })

html = (df.style.\
        apply(AboveTarget, subset = pd.IndexSlice[0:1, ["Adam", "Gill", "Target"]], axis = 1)
       )

html

将列“ Target”传递给函数,并与相应的s["Target"]值进行比较。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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