[英]ValueError: Series lengths must match to compare when matching dates in Pandas
[英]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中,您试图将一个名为s
的pd.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=1
, AboveTarget
的参数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.