Применение условного форматирования к столбцу Excel из pandas кадра данных - PullRequest
1 голос
/ 02 апреля 2020

Я пытаюсь создать документ Excel с несколькими листами и применить условное форматирование для выбора столбцов на листе, однако по какой-то причине я не могу применить условное форматирование при открытии листа.

newexcelfilename= 'ResponseData_'+date+'.xlsx'
exceloutput = "C:\\Users\\jimbo\\Desktop\\New folder (3)\\output\\"+newexcelfilename

print("Writing to Excel file...")
# Given a dict of pandas dataframes
dfs = {'Tracts': tracts_finaldf, 'Place':place_finaldf,'MCDs':MCD_finaldf,'Counties': counties_finaldf, 'Congressional Districts':cd_finaldf,'AIAs':aia_finaldf}

writer = pd.ExcelWriter(exceloutput, engine='xlsxwriter')
workbook  = writer.book
## columns for 3 color scale formatting export out of pandas as text, need to convert to 
number format.
numberformat = workbook.add_format({'num_format': '00.0'})
## manually applying header format
header_format = workbook.add_format({
    'bold': True,
    'text_wrap': False,
    'align': 'left',
    })


for sheetname, df in dfs.items():  # loop through `dict` of dataframes
    df.to_excel(writer, sheet_name=sheetname, startrow=1,header=False,index=False)  # send df to writer
    worksheet = writer.sheets[sheetname]  # pull worksheet object
    for col_num, value in enumerate(df.columns.values):
        worksheet.write(0, col_num, value, header_format)
    for idx, col in enumerate(df):  # loop through all columns
        series = df[col]
        col_len = len(series.name)  # len of column name/header
        worksheet.set_column(idx,idx,col_len)
        if col in ['Daily Internet Response Rate (%)',
                   'Daily Response Rate (%)',
                   'Cumulative Internet Response Rate (%)',
                   'Cumulative Response Rate (%)']:
            worksheet.set_column(idx,idx,col_len,numberformat)
        if col == 'DATE':
            worksheet.set_column(idx,idx,10)
        if col == 'ACO':
            worksheet.set_column(idx,idx,5)
    ## applying conditional formatting to columns which were converted to the 
    numberformat
    if worksheet == 'Tracts':
        worksheet.conditional_format('E2:H11982', {'type':'3_color_scale',
                                    'min_color': 'FF5733',
                                    'mid_color':'FFB233',
                                    'max_color': 'C7FF33',
                                    'min_value': 0,
                                    'max_vallue': 100})

writer.save()

В коде все работает правильно с точки зрения изменения ширины столбцов и применения формата чисел c к указанным столбцам, однако я не могу применить условное форматирование.

Я пытался найти все остальные вопросы по обмену стека, но не могу найти ответ.

1 Ответ

0 голосов
/ 03 апреля 2020

У вас есть несколько синтаксических ошибок в условном формате, например, не указано цвета в формате Html и опечатка в max_value. Как только те исправлены, это должно работать. Вот небольшой рабочий пример, основанный на вашем:

import pandas as pd


# Create a Pandas dataframe from some data.
df = pd.DataFrame({'Data': [10, 20, 30, 20, 15, 30, 45]})

# Create a Pandas Excel writer using XlsxWriter as the engine.
writer = pd.ExcelWriter('pandas_conditional.xlsx', engine='xlsxwriter')

# Convert the dataframe to an XlsxWriter Excel object.
df.to_excel(writer, sheet_name='Sheet1')

# Get the xlsxwriter workbook and worksheet objects.
workbook  = writer.book
worksheet = writer.sheets['Sheet1']

# Apply a conditional format to the cell range.
worksheet.conditional_format('B2:B8', 
                             {'type': '3_color_scale',
                              'min_color': '#FF5733',
                              'mid_color': '#FFB233',
                              'max_color': '#C7FF33',
                              'min_value': 0,
                              'max_value': 100})

# Close the Pandas Excel writer and output the Excel file.
writer.save()

Вывод:

enter image description here

Также эта строка:

    if worksheet == 'Tracts':

Вероятно, должно быть:

    if sheetname == 'Tracts':
...