【问题标题】:Highlight row in a data frame based on a column value?根据列值突出显示数据框中的行?
【发布时间】:2021-08-04 14:37:18
【问题描述】:

假设我有这样的数据框:

     col1    col2          col3       col4
0    A        A_1          pass        2
1    A        A_2          pass        4
2    A        A_1          fail        4
3    A        A_1          fail        5
4    A        A_1          pass        3
5    A        A_2          fail        2

我想将其保存为 excel 文件,然后当我打开它时,我希望列像下面那样突出显示,我该怎么做?

【问题讨论】:

  • 你想在哪里突出显示它?在电子表格中?作为 python 的 GUI?
  • 嘿@kinshukdua,我想将它保存为一个excel文件,当我打开它时,我希望像我在我的问题中描述的那样突出显示行

标签: python excel pandas dataframe


【解决方案1】:

您可以使用Styler.apply 创建样式的DataFrame,并使用DataFrame.mask 通过掩码设置行:

def color(x): 
   c1 = 'background-color: green'
   c2 = 'background-color: red'
   c = ''
   m1 = x.col3.eq('pass')
   m2 = x.col3.eq('fail')

   df1 = pd.DataFrame(c, index=x.index, columns=x.columns)
   df1 = df1.mask(m1, c1).mask(m2, c2)
   return df1

df.style.apply(color,axis=None).to_excel('styled.xlsx', engine='openpyxl', index=False)

【讨论】:

  • 嘿@jezrael,如果我只想用黄色为 col3 标题着色,我该怎么做?
  • 在 pandas 中的样式真的很复杂,可以发布新问题吗?
【解决方案2】:

你也可以这样做:

from openpyxl import load_workbook
from openpyxl.styles import PatternFill

df.to_excel('my dataframe.xlsx', index=False)
wb = load_workbook('my dataframe.xlsx')
ws = wb.active

for row in ws.iter_rows(min_col=ws.min_column, max_col=ws.max_column,
                        min_row=ws.min_row+1, max_row=ws.max_row):
    for value in row:
        if row[2].value == 'pass':
            value.fill = PatternFill(fill_type='solid', start_color='00b300', end_color='00b300')
        else:
            value.fill = PatternFill(fill_type='solid', start_color='ff0000', end_color='ff0000')

wb.save('my dataframe.xlsx')

结果:

【讨论】:

  • 如果我只想将 col3 标题用黄色着色,我该怎么做?
  • ws['C1'].fill = PatternFill(fill_type='solid', start_color='ffff00', end_color='ffff00')
猜你喜欢
  • 2011-12-01
  • 2015-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-31
  • 2018-12-12
相关资源
最近更新 更多