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应用
    ”知道如何修复它吗?