Python – 使用pandas来格式化Excel单元格

我有一个pandas数据框,就像下面显示的那样。

dataframee

我想格式化列“通过/失败”, if Fail --> red background, else green background ,如:

格式

我曾尝试使用pandas来进行格式化,但是无法为excel添加颜色。 以下是代码:

 writer = pandas.ExcelWriter(destination,engine = 'xlsxwriter') color = Answer.style.applymap(lambda x: 'color: red' if x == "Fail" else 'color: green',subset= pandas.IndexSlice[:,['Pass/Fail']]) color.to_excel(writer,'sheet1') 

我尝试了StyleFrame安装失败。 似乎StyleFrame不符合我的python版本3.6。

我如何根据需要设置excel的格式?

你可以使用conditional_format :

 df = pd.DataFrame({'Pass/Fail':['Pass','Fail','Fail'], 'expect':[1,2,3]}) print (df) Pass/Fail expect 0 Pass 1 1 Fail 2 2 Fail 3 writer = pd.ExcelWriter('pandas_conditional.xlsx', engine='xlsxwriter') df.to_excel(writer, sheet_name='Sheet1') workbook = writer.book worksheet = writer.sheets['Sheet1'] red_format = workbook.add_format({'bg_color':'red'}) green_format = workbook.add_format({'bg_color':'green'}) worksheet.conditional_format('B2:B4', {'type': 'text', 'criteria': 'containing', 'value': 'Fail', 'format': red_format}) worksheet.conditional_format('B2:B4', {'type': 'text', 'criteria': 'containing', 'value': 'Pass', 'format': green_format}) writer.save() 

get_loc用于column位置和dictionary映射的更dynamic的解决scheme:

 import string df = pd.DataFrame({'Pass/Fail':['Pass','Fail','Fail'], 'expect':[1,2,3]}) print (df) Pass/Fail expect 0 Pass 1 1 Fail 2 2 Fail 3 

 writer = pd.ExcelWriter('pandas_conditional.xlsx', engine='xlsxwriter') df.to_excel(writer, sheet_name='Sheet1') workbook = writer.book worksheet = writer.sheets['Sheet1'] red_format = workbook.add_format({'bg_color':'red'}) green_format = workbook.add_format({'bg_color':'green'}) #dict for map excel header, first A is index, so omit it d = dict(zip(range(25), list(string.ascii_uppercase)[1:])) print (d) {0: 'B', 1: 'C', 2: 'D', 3: 'E', 4: 'F', 5: 'G', 6: 'H', 7: 'I', 8: 'J', 9: 'K', 10: 'L', 11: 'M', 12: 'N', 13: 'O', 14: 'P', 15: 'Q', 16: 'R', 17: 'S', 18: 'T', 19: 'U', 20: 'V', 21: 'W', 22: 'X', 23: 'Y', 24: 'Z'} #set column for formatting col = 'Pass/Fail' excel_header = str(d[df.columns.get_loc(col)]) #get length of df len_df = str(len(df.index) + 1) rng = excel_header + '2:' + excel_header + len_df print (rng) B2:B4 worksheet.conditional_format(rng, {'type': 'text', 'criteria': 'containing', 'value': 'Fail', 'format': red_format}) worksheet.conditional_format(rng, {'type': 'text', 'criteria': 'containing', 'value': 'Pass', 'format': green_format}) writer.save() 

EDIT1:

谢谢jmcnamara的评论和XlsxWriter

 col = 'Pass/Fail' loc = df.columns.get_loc(col) + 1 len_df = len(df.index) + 1 worksheet.conditional_format(1,loc,len_df,loc, {'type': 'text', 'criteria': 'containing', 'value': 'Fail', 'format': red_format}) worksheet.conditional_format(1,loc,len_df,loc, {'type': 'text', 'criteria': 'containing', 'value': 'Pass', 'format': green_format}) writer.save() 

编辑:

最后一个版本的pandas( 0.20.1 )和风格的另一个解决scheme:

 df = pd.DataFrame({'Pass/Fail':['Pass','Fail','Fail'], 'expect':['d','f','g']}) print (df) Pass/Fail expect 0 Pass d 1 Fail f 2 Fail g def f(x): col = 'Pass/Fail' r = 'background-color: red' g = 'background-color: green' c = np.where(x[col] == 'Pass', g, r) y = pd.DataFrame('', index=x.index, columns=x.columns) y[col] = c return y styled = df.style.apply(f, axis=None) styled.to_excel('styled.xlsx', engine='openpyxl') 

免责声明:我写了下面的库

我想build议使用StyleFrame :

 import pandas as pd from StyleFrame import StyleFrame, Styler df = pd.DataFrame({'Pass/Fail':['Pass','Fail','Fail'], 'expect':[1,2,3]}) sf = StyleFrame(df) sf.apply_style_by_indexes(sf[sf['Pass/Fail'] == 'Pass'], cols_to_style='Pass/Fail', styler_obj=Styler(bg_color='green')) sf.apply_style_by_indexes(sf[sf['Pass/Fail'] == 'Fail'], cols_to_style='Pass/Fail', styler_obj=Styler(bg_color='red')) sf.to_excel('test.xlsx').save() 

由于它跨越了pandas和openpyxl之间的差距,所以样式是在数据框级别而不是工作表级别完成的(例如,您不需要知道相关单元格区域是B2:B4还是混乱了索引。

上面的代码输出如下:

在这里输入图像描述

编辑:只是看到你提到你已经试图安装,但有一个错误。 你能编辑你的问题,并包括错误?