列中的条件格式单元格基于它在另一列中的相应值

我从一个看起来像这样的数据框中创build了一个excel文件:

In [215]: import pandas as pd In [216]: df = pd.DataFrame({"Name": ["A", "B", "C"], "Status": ['y', 'n', 'yy']}) In [217]: df Out[217]: Name Status 0 A y 1 B n 2 C yy 

如何根据Status的值设置“Name”的bg_color ? 我尝试了几个选项没有成功:

 format1 = workbook.add_format({"bg_color": "#669731"}) format2 = workbook.add_format({"bg_color": "#FFFA22"}) format3 = workbook.add_format({"bg_color": "#A43829"}) 

选项1

 worksheet.conditional_format("A2", {"type": "formula", "criteria": "=ISNUMBER(SEARCH('y', B2))", "format": format1 } ) 

选项2

 worksheet.conditional_format("A2", {"type": "formula", "criteria": "=$B$2='y'", "format": format1 } ) 

这些都没有给出预期的结果,当我打开文件,我得到一个错误,以下消息: .xlsx中的不可读内容
如果我能以某种方式设置而不迭代dataframe的值,这将是很好的。

Excel似乎不喜欢string条件格式化的单引号。 它的作品,如果你有双引号内,即

 "criteria": '=($B$2="y")' 

 "criteria": "=($B$2='y')" 

我已经把解决scheme的截图放在下面的一个完整的可重复的例子。

 import pandas as pd df = pd.DataFrame({"Name": ["A", "B", "C"], "Status": ['y', 'n', 'yy']}) writer = pd.ExcelWriter('test.xlsx', engine='xlsxwriter') df.to_excel(writer, sheet_name='Sheet1', index=False) workbook = writer.book worksheet = writer.sheets['Sheet1'] format1 = workbook.add_format({"bg_color": "#669731"}) worksheet.conditional_format("A2", {"type": "formula", "criteria": '=($B$2="y")', "format": format1 } ) workbook.close() 

截图条件格式

如果你想在列中设置1000个单元格的范围,则可以使用条件格式的代码。

 worksheet.conditional_format("A2:A1001", {"type": "formula", "criteria": '=(B2:B1001="y")', "format": format1 } ) 

另一方面,如果你想在一个范围内设置多个条件,我认为这是可能的唯一方法是使用一个for循环,写入与条件相匹配的格式的每个单元格。 我已经提供了下面的例子,它是预期的输出。 请注意,如果满足三个条件中的任何一个,那么这将会覆盖已经放置在单元中的内容,这有点欺骗。

 import pandas as pd df = pd.DataFrame({"Name": ["A", "B", "C"], "Status": ['y', 'n', 'yy']}) writer = pd.ExcelWriter('test.xlsx', engine='xlsxwriter') df.to_excel(writer, sheet_name='Sheet1', index=False) workbook = writer.book worksheet = writer.sheets['Sheet1'] format1 = workbook.add_format({"bg_color": "#669731"}) format2 = workbook.add_format({"bg_color": "#FFFA22"}) format3 = workbook.add_format({"bg_color": "#A43829"}) for i in range (0, len(df)): if df['Status'].ix[i] == "y": worksheet.write(i+1, 0, df['Name'].ix[i], format1) elif df['Status'].ix[i] == "n": worksheet.write(i+1, 0, df['Name'].ix[i], format2) elif df['Status'].ix[i] == "yy": worksheet.write(i+1, 0, df['Name'].ix[i], format3) workbook.close() 

在这里输入图像说明