在Pandas中对单元格进行着色

29
我可以使用Pandas从Excel文件中导入数据,方法如下:
xl = read_excel('path_to_file.xls', 'Sheet1', index_col=None, na_values=['NA'])    

现在我已经将所有数据作为DataFrame存储在xl中,我想根据另一个函数中定义的条件对该数据中的某些单元格进行着色,然后将带有颜色编码的相同数据导出到Excel文件中。
我该如何在Pandas的DataFrame中着色特定的单元格?

那么我应该使用哪个库呢? - Rahul Wadhwani
xlwtxlutils 可以用来操作 Excel 文件。也可以使用免费的 http://xlwings.org 或付费的 https://datanitro.com 直接控制 Excel。Pandas 不是专门设计用于操作 Excel 文件,它只是读取文件并方便进行计算。 - elyase
openpyxl得到了良好的维护,并且最近进行了许多更新。 - nitin
你是想根据电子表格中的值生成十六进制颜色,还是实际上要给Excel工作簿中的单元格着色?抱歉,我从你的问题中没有明确这一点。 - benjaminmgross
我想要给Excel工作簿中的单元格上色。 - Rahul Wadhwani
1
您可以使用Pandas中的xlsxwriter引擎,对Excel工作表中的数据应用条件格式。请参见Easiest way to create a color gradient on excel using python/pandas?中的答案。这可能是您想要做的事情。 - jmcnamara
4个回答

62

Pandas有一个相对较新的Styler功能,您可以将条件格式化类型操作应用于数据帧。

http://pandas.pydata.org/pandas-docs/stable/style.html

您可以使用一些内置函数,例如background_gradientbar,以复制类似于Excel的特性,如条件格式和数据条。 您还可以格式化单元格以显示百分比,浮点数,整数等,而不改变原始数据帧。

以下是使用Styler制作的图表示例(这是一个无意义的图表,仅用于演示功能):

enter image description here

要充分利用Styler的功能,您需要熟悉Styler.apply()Styler.applymap() API。这些API允许您创建自定义函数并将其应用于表格的列、行或元素。例如,如果我想将正值单元格涂成绿色,负值单元格涂成红色,我会创建一个函数。
def _color_red_or_green(val):
    color = 'red' if val < 0 else 'green'
    return 'color: %s' % color

我需要在我的Styler对象上调用它,即df.style.applymap(_color_red_or_green)

关于导出回Excel,据我所知,Styler目前还不支持此功能,因此如果您确实需要使用Excel,则可能需要选择xlsxwriter。然而,根据我的经验,这是一个很好的纯Python替代方案,例如与matplotlib图表一起使用或在电子邮件/报告中使用。


从 Pandas 0.20.0 开始支持将 Styler 对象导出回 Excel --https://pandas.pydata.org/pandas-docs/stable/generated/pandas.io.formats.style.Styler.to_excel.html - p_sutherland
@wkzhu 当我尝试运行你的代码时,我得到了"<pandas.core.style.Styler at 0x259e2be0>"而不是表格显示,有什么想法吗? - trock2000
@trock2000 你尝试过这个例子吗?https://pandas.pydata.org/pandas-docs/stable/user_guide/style.html#Building-styles 你是在Jupyter笔记本上运行吗? - wkzhu
@wkzhu,正如你所推断的那样,问题出在我是在Spyder中运行它——现在在Jupyter中运行,谢谢。 - trock2000

13
最简单的方法是使用applymap和lambda,如果你只想突出显示特定的值。
df.style.applymap(lambda x: "background-color: red" if x>0 else "background-color: white")

是否有适用于Python的离散和连续映射的颜色数据库可用,类似于Wolfram的ColorData - alancalvitti
@alancalvitti 我不确定,但你可以将十六进制值作为选项传递。 - robertlayton

2
有关在Pandas网站上设置单元格样式的想法有很多。但是它提到:这是一个新功能,仍在开发中。我们将在未来的发布版本中添加功能并可能进行重大更改。

1
尝试像这样做些事情:
with pandas.io.excel.ExcelWriter(path=Path, engine="xlsxwriter") as writer:
   sheet = writer.book.worksheets()[0]
   sheet.write(x, y, value, format) #format is what determines the color etc.

更多信息请参见:https://xlsxwriter.readthedocs.org/format.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接