如何使用Python Pandas Stylers根据给定列着色整行?

Dre*_*rts 8 python pandas

我一直在尝试将Pandas数据帧打印到html,并且如果该行的一个特定列的值超过阈值,则突出显示特定的整行.我仔细查看了Pandas Styler Slicing并试图改变highlight_max函数以供这样的使用,但似乎失败了; 如果我尝试替换is_max并检查给定行的值是否高于所述阈值(例如,类似于

is_x = df['column_name'] >= threshold
Run Code Online (Sandbox Code Playgroud)

),如何正确传递这样的东西或返回什么并不明显.

我也尝试使用df.loc在其他地方简单地定义它,但这也没有奏效.

还出现了另一个问题:如果我之后删除该列(当前是标准),那么样式仍然会保留吗?我想知道df.loc是否会阻止这样的问题.

Sco*_*ton 14

此解决方案允许您传递列标签或列标签列表,以便在列中的值超过阈值时突出显示整行.

import pandas as pd
import numpy as np

np.random.seed(24)
df = pd.DataFrame({'A': np.linspace(1, 10, 10)})

df = pd.concat([df, pd.DataFrame(np.random.randn(10, 4), columns=list('BCDE'))],
               axis=1)
df.iloc[0, 2] = np.nan

def highlight_greaterthan(s, threshold, column):
    is_max = pd.Series(data=False, index=s.index)
    is_max[column] = s.loc[column] >= threshold
    return ['background-color: yellow' if is_max.any() else '' for v in is_max]


df.style.apply(highlight_greaterthan, threshold=1.0, column=['C', 'B'], axis=1)
Run Code Online (Sandbox Code Playgroud)

输出:

在此输入图像描述

或者一列

df.style.apply(highlight_greaterthan, threshold=1.0, column='E', axis=1)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


Ste*_*ven 11

这是一个更简单的方法:

  1. 假设您有一个 100 x 10 的数据帧 df。还假设您要突出显示与一列相对应的所有行,例如“持续时间”,大于 5。

  2. 您首先需要定义一个突出显示单元格的函数。真正的技巧是您需要返回一行,而不是单个单元格。例如,

    def highlight(s):
        if s.duration > 5:
            return ['background-color: yellow']*10
        else:
            return ['background-color: white']*10
    
    Run Code Online (Sandbox Code Playgroud)

**注意返回部分应该是一个10的列表(对应列数)。这是关键部分。

  1. 现在您可以将其应用于数据框样式,如下所示:

    df.style.apply(highlight, axis=1)
    
    Run Code Online (Sandbox Code Playgroud)

  • 您可以使用 len(s) 来考虑数据帧的任何宽度,而不是硬编码 10 (7认同)

Ynj*_*jmh 8

假设您有以下数据框,并且您想要将id大于的行突出显示3为红色

   id char       date
0   0    s 2022-01-01
1   1    t 2022-02-01
2   2    y 2022-03-01
3   3    l 2022-04-01
4   4    e 2022-05-01
5   5    r 2022-06-01
Run Code Online (Sandbox Code Playgroud)

你可以尝试Styler.set_properties使用pandas.IndexSlice

   id char       date
0   0    s 2022-01-01
1   1    t 2022-02-01
2   2    y 2022-03-01
3   3    l 2022-04-01
4   4    e 2022-05-01
5   5    r 2022-06-01
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


您还可以尝试Styler.apply使用axis=Nonewhich 传递整个数据框。

# Subset your original dataframe with condition
df_ = df[df['id'].gt(3)]

# Pass the subset dataframe index and column to pd.IndexSlice
slice_ = pd.IndexSlice[df_.index, df_.columns]

s = df.style.set_properties(**{'background-color': 'red'}, subset=slice_)
s.to_html('test.html')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述