我有这样的功能:
def highlight_otls(df):
return ['background-color: yellow']
像这样的DataFrame:
price outlier
1.99 F,C
1.49 L,C
1.99 F
1.39 N
我想要做的是根据另一列的这个条件突出显示我的df中的某个列:
data['outlier'].str.split(',').str.len() >= 2
因此,如果列值df ['outlier']> = 2,我想突出显示相应的列df ['price']。 (因此前两个价格应该在我的数据框中突出显示)。
我尝试通过执行以下操作来执行此操作,这会给我一个错误:
data['price'].apply(lambda x: highlight_otls(x) if (x['outlier'].str.split(',').str.len()) >= 2, axis=1)
有关如何以正确的方式做到这一点的任何想法?
答案 0 :(得分:2)
要点
lambda
函数的多列中的值,因此仅应用于整个数据框而不是价格列。axis
参数的问题。else x
以修复lambda
x
中对lambda
进行索引时,它是一个值,不再是一个系列,因此请终止str
属性调用,只需在其上调用len
。< / LI>
醇>
所以试试:
data.apply(lambda x: highlight_otls(x) if len(x['outlier'].split(',')) >= 2 else x, axis=1)
<强>输出强>
0 [background-color: yellow]
1 [background-color: yellow]
2 [None, None]
3 [None, None]
dtype: object
根据您的评论处理空异常值的一种方法是将突出显示条件逻辑重构为highlight_otls
函数:
def highlight_otls(x):
if len(x['outlier'].split(',')) >= 2:
return ['background-color: yellow']
else:
return x
data.apply(lambda x: highlight_otls(x) if pd.notnull(x['outlier']) else x, axis=1)
顺便说一下,当您不想应用突出显示时,您可能希望返回['background-color: white']
而不是x
之类的内容。
答案 1 :(得分:2)
使用Styler.apply
。 (要输出为xlsx
格式,请使用to_excel
函数。)
假设一个人的数据集是
other price outlier
0 X 1.99 F,C
1 X 1.49 L,C
2 X 1.99 F
3 X 1.39 N
def hightlight_price(row):
ret = ["" for _ in row.index]
if len(row.outlier.split(",")) >= 2:
ret[row.index.get_loc("price")] = "background-color: yellow"
return ret
df.style.\
apply(hightlight_price, axis=1).\
to_excel('styled.xlsx', engine='openpyxl')
从documentation开始,“DataFrame.style
属性是一个返回Styler对象的属性。”
我们将样式函数hightlight_price
传递给Styler.apply
,并要求axis=1
函数的行方式性质。 (回想一下,我们希望根据同一行中的price
信息 为每行中的outlier
单元着色。)
我们的函数hightlight_price
将为每行生成视觉样式 。对于每一行row
,我们首先为other
,price
和outlier
列生成样式为["", "", ""]
。我们可以获取正确的索引,仅使用price
修改列表中的row.index.get_loc("price")
部分,如
ret[row.index.get_loc("price")] = "background-color: yellow"
# ret becomes ["", "background-color: yellow", ""]
<强>结果
答案 2 :(得分:0)
我建议使用自定义函数按条件返回styled DataFrame
,最后export Excel file:
def highlight_otls(x):
c1 = 'background-color: yellow'
c2 = ''
mask = x['outlier'].str.split(',').str.len() >= 2
df1 = pd.DataFrame(c2, index=df.index, columns=df.columns)
#modify values of df1 column by boolean mask
df1.loc[mask, 'price'] = c1
#check styled DataFrame
print (df1)
price outlier
0 background-color: yellow
1 background-color: yellow
2
3
return df1
df.style.apply(highlight_otls, axis=None).to_excel('styled.xlsx', engine='openpyxl')