在Pandas Dataframe中把负值标为红色,正值标为黑色

  • Post category:Python

在Pandas Dataframe中,可以使用Conditional Formatting(条件格式)将负值标为红色,正值标为黑色。下面展示一个完整的过程,包括创建一个包含负值和正值的DataFrame、设置条件格式并将其应用到这个DataFrame上。

首先,我们需要导入必要的包:

import pandas as pd
import numpy as np

from openpyxl import load_workbook
from openpyxl.formatting.rule import ColorScaleRule
from openpyxl.styles import Font, Color
from openpyxl.utils import get_column_letter

然后,我们创建一个包含随机正负数的DataFrame:

np.random.seed(42)
df = pd.DataFrame({'A': np.random.randint(-10, 10, 10),
                   'B': np.random.randint(-10, 10, 10),
                   'C': np.random.randint(-10, 10, 10)})

接下来,我们为DataFrame生成Excel文件,并使用openpyxl读取Excel文件:

writer = pd.ExcelWriter('example.xlsx', engine='openpyxl')
df.to_excel(writer, sheet_name='Sheet1', index=False)
writer.save()

book = load_workbook('example.xlsx')
sheet = book.active

创建一个ColorScaleRule实例,并定义要应用的颜色规则:

red = Color(rgb='FF0000')
black = Color(rgb='000000')

rule = ColorScaleRule(start_type='min', start_color=red,
                      end_type='max', end_color=black)

使用get_column_letter获取要格式化的列的字母表示,并使用Font实例创建字体:

neg_font = Font(color=red)
pos_font = Font(color=black)

for i, col in enumerate(df.columns):
    letter = get_column_letter(i+1)
    sheet.conditional_formatting.add(f'{letter}2:{letter}11', rule)
    for j in range(2, 12):
        cell_value = sheet[f'{letter}{j}'].value
        if cell_value < 0:
            sheet[f'{letter}{j}'].font = neg_font
        elif cell_value > 0:
            sheet[f'{letter}{j}'].font = pos_font

最后,我们保存结果并查看结果:

book.save('example.xlsx')

这样,我们就成功地将Pandas DataFrame中的负值标记为红色,正值标记为黑色。