如何使用 Pandas 样式器根据给定列为整行着色?
How to use Pandas stylers for coloring an entire row based on a given column?
我一直在尝试将 Pandas 数据帧打印到 html 并突出显示特定的整行,如果该行的一个特定列的值超过阈值。我查看了 Pandas Styler Slicing 并尝试改变 highlight_max 函数以用于此类用途,但似乎失败得很惨;例如,如果我尝试用检查给定行的值是否高于所述阈值来替换 is_max(例如
is_x = df['column_name'] >= threshold
), 如何正确传递这样的东西或传递给 return.
的东西并不明显
我也曾尝试使用 df.loc 在别处简单地定义它,但效果也不是很好。
另一个问题也出现了:如果我之后删除该列(当前标准),样式是否仍然有效?我想知道 df.loc 是否可以防止这样的事情成为问题。
如果列中的值超过阈值,此解决方案允许您传递列标签或列标签列表以突出显示整行。
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)
输出:
或一列
df.style.apply(highlight_greaterthan, threshold=1.0, column='E', axis=1)
这里有一个更简单的方法:
假设您有一个 100 x 10 的数据框,df。还假设您要突出显示与列对应的所有行,例如“持续时间”,大于 5。
您首先需要定义一个突出显示单元格的函数。真正的诀窍是您需要 return 一行,而不是单个单元格。例如:
def highlight(s):
if s.duration > 5:
return ['background-color: yellow'] * len(s)
else:
return ['background-color: white'] * len(s)
**注意return部分应该是一个10的列表(对应列数)。这是关键部分。
现在您可以将其应用于数据框样式:
df.style.apply(highlight, axis=1)
假设您有以下数据框,并且您想要将 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
你可以试试Styler.set_properties
with pandas.IndexSlice
# 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')
您也可以尝试使用 Styler.apply
和 axis=None
来传递整个数据帧。
def styler(df):
color = 'background-color: {}'.format
mask = pd.concat([df['id'].gt(3)] * df.shape[1], axis=1)
style = np.where(mask, color('red'), color('green'))
return style
s = df.style.apply(styler, axis=None)
我一直在尝试将 Pandas 数据帧打印到 html 并突出显示特定的整行,如果该行的一个特定列的值超过阈值。我查看了 Pandas Styler Slicing 并尝试改变 highlight_max 函数以用于此类用途,但似乎失败得很惨;例如,如果我尝试用检查给定行的值是否高于所述阈值来替换 is_max(例如
is_x = df['column_name'] >= threshold
), 如何正确传递这样的东西或传递给 return.
的东西并不明显我也曾尝试使用 df.loc 在别处简单地定义它,但效果也不是很好。
另一个问题也出现了:如果我之后删除该列(当前标准),样式是否仍然有效?我想知道 df.loc 是否可以防止这样的事情成为问题。
如果列中的值超过阈值,此解决方案允许您传递列标签或列标签列表以突出显示整行。
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)
输出:
或一列
df.style.apply(highlight_greaterthan, threshold=1.0, column='E', axis=1)
这里有一个更简单的方法:
假设您有一个 100 x 10 的数据框,df。还假设您要突出显示与列对应的所有行,例如“持续时间”,大于 5。
您首先需要定义一个突出显示单元格的函数。真正的诀窍是您需要 return 一行,而不是单个单元格。例如:
def highlight(s): if s.duration > 5: return ['background-color: yellow'] * len(s) else: return ['background-color: white'] * len(s)
**注意return部分应该是一个10的列表(对应列数)。这是关键部分。
现在您可以将其应用于数据框样式:
df.style.apply(highlight, axis=1)
假设您有以下数据框,并且您想要将 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
你可以试试Styler.set_properties
with pandas.IndexSlice
# 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')
您也可以尝试使用 Styler.apply
和 axis=None
来传递整个数据帧。
def styler(df):
color = 'background-color: {}'.format
mask = pd.concat([df['id'].gt(3)] * df.shape[1], axis=1)
style = np.where(mask, color('red'), color('green'))
return style
s = df.style.apply(styler, axis=None)