Python 基于表中的另一列值高亮显示列值
我有这样一个函数:Python 基于表中的另一列值高亮显示列值,python,pandas,Python,Pandas,我有这样一个函数: def highlight_otls(df): return ['background-color: yellow'] price outlier 1.99 F,C 1.49 L,C 1.99 F 1.39 N 和这样的数据帧: def highlight_otls(df): return ['background-color: yellow'] price outlier 1.99
def highlight_otls(df):
return ['background-color: yellow']
price outlier
1.99 F,C
1.49 L,C
1.99 F
1.39 N
和这样的数据帧:
def highlight_otls(df):
return ['background-color: yellow']
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']。(因此,前2个价格应该在上面的数据框中突出显示)
我尝试通过执行以下操作来执行此操作,这会给我一个错误:
data['price'].apply(lambda x: highlight_otls(x) if (x['outlier'].str.split(',').str.len()) >= 2, axis=1)
你知道怎么用正确的方法吗
要点
lambda
函数访问多列中的值,因此只应用于整个数据帧,而不是价格列轴
参数的问题else x
以修复lambda的条件逻辑中的语法错误
lambda
中索引x
时,它是一个值,不再是一个序列,因此请终止str
属性调用,只需对其调用len
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
根据注释处理空异常值的一种方法是将高亮显示条件逻辑重构为高亮显示\u 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
。使用Styler.apply
。(要输出到xlsx
格式,请使用函数。)
假设一个人的数据集是
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')
从“DataFrame.style
属性是一个返回样式器对象的属性。”
我们将样式化函数hightlight\u price
传递到样式器中。应用并要求函数具有轴=1的行性质。(回想一下,我们希望根据同一行中的异常值
信息为每行中的price
单元格上色。)
我们的函数hightlight\u price
将为每一行生成视觉样式。对于每一行行
,我们首先为其他
、价格
和异常值
列生成样式,使其成为[,,,][/code>。我们可以获得正确的索引,以便只修改列表中的price
部分,使用row.index.get_loc(“price”)
,如中所示
ret[row.index.get_loc("price")] = "background-color: yellow"
# ret becomes ["", "background-color: yellow", ""]
结果
我建议按条件使用自定义函数返回样式化数据帧
,最后:
感谢您的澄清!如何将pd.notnull()添加到x['outlier']?在一些情况下,我的完整数据框中没有异常值,所以我得到了这个错误-AttributeError:(“'float'对象没有属性'str','发生在索引0'),所以实际上,当我用这个代码输出我的excel文件时,我没有看到任何黄色突出显示的字段,知道为什么吗?谢谢你的回答!我得到了一个错误:“AttributeError:(“'float'对象没有属性'split','发生在索引0')”,虽然'outlier'列是一个带有一些NaN值的str,您知道如何修复它吗?您是否可以指定高亮显示格式应用于'price'列?在我的实际数据帧中,还有其他我不想突出显示的列。谢谢@Hana对于第一个问题,我认为这是因为在异常值
列中缺少了一些数据,如NaN
。你能帮我用df.outlier.isna().any()
检查一下吗?@Hana关于第二个问题,请查看更新。@Hana如果你的第一个问题是由类似NaN
的原因引起的,请使用df.outlier.fillna(“,inplace=True”)
来修复它。嘿,这给了我一个错误:“TypeError:当传递给样式器时,函数必须返回一个数据帧。使用axis=None应用
”知道如何修复它吗?