根据pandas中的另一个列值突出显示列值

时间:2018-06-06 15:37:26

标签: python pandas

我有这样的功能:

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)

有关如何以正确的方式做到这一点的任何想法?

3 个答案:

答案 0 :(得分:2)

要点

  1. 您需要访问lambda函数的多列中的值,因此仅应用于整个数据框而不是价格列。
  2. 以上也解决了适用于一系列没有axis参数的问题。
  3. 添加else x以修复lambda
  4. 的条件逻辑中的语法错误
  5. 当您在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,我们首先为otherpriceoutlier列生成样式为["", "", ""]。我们可以获取正确的索引,仅使用price修改列表中的row.index.get_loc("price")部分,如

ret[row.index.get_loc("price")] = "background-color: yellow"
# ret becomes ["", "background-color: yellow", ""]

<强>结果

enter image description here

答案 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')

pic