【问题标题】:Coloring Cells in PandasPandas 中的着色细胞
【发布时间】:2015-03-20 11:21:13
【问题描述】:

我可以使用 Pandas 从 Excel 文件中导入数据,方法是:

xl = read_excel('path_to_file.xls', 'Sheet1', index_col=None, na_values=['NA'])    

现在我将 xl 中的所有数据作为 DataFrame。我想根据另一个函数中定义的条件为该数据中的某些单元格着色,并将其(使用颜色编码)导出到 Excel 文件。

谁能告诉我该怎么做?

谢谢。

【问题讨论】:

  • 那我应该使用哪个库?
  • xlwtxlutils。也可以是xlwings.org(免费)或datanitro.com(付费),用于直接控制excel。 Pandas 不是为处理 excel 文件而设计的,它只是从它们中读取数据并便于计算。
  • openpyxl 维护良好,最近有很多更新
  • 您是要根据从电子表格中提取的值生成十六进制颜色,还是实际为 Excel 工作簿中的单元格着色?抱歉,您的问题我并不清楚这一点。
  • 您可以使用 Pandas 的 xlsxwriter 引擎将条件格式应用于 Excel 工作表中的数据。请参阅Easiest way to create a color gradient on excel using python/pandas? 的答案。这可能与您想要做的很接近。

标签: python pandas ipython


【解决方案1】:

如果您只想突出显示某些值,最简单的方法是使用 applymap 和 lambda:

df.style.applymap(lambda x: "background-color: red" if x>0 else "background-color: white")

【讨论】:

  • 是否有可用于 python 的离散和连续映射的颜色数据库,类似于 Wolfram's ColorData
  • @alancalvitti 我不确定,但您可以将十六进制值作为选项传递。
【解决方案2】:

Pandas 有一个相对较新的 Styler 功能,您可以在其中将条件格式类型操作应用于数据帧。 http://pandas.pydata.org/pandas-docs/stable/style.html

您可以使用它们的一些内置函数(例如 background_gradientbar)来复制类似 excel 的功能,例如条件格式和数据条。您还可以格式化单元格以显示百分比、浮点数、整数等,而无需更改原始数据框。

这是您可以使用Styler 制作的图表类型示例(这是一个无意义的图表,但只是为了展示功能):

要利用Styler 的全部功能,您应该熟悉Styler.apply()Styler.applymap() API。这些允许您创建自定义函数并将它们应用于表格的列、行或元素。例如,如果我想将 +ive 单元格着色为绿色,将 -ive 单元格着色为红色,我将创建一个函数

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 图表和电子邮件/报告一起使用。

【讨论】:

【解决方案3】:

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

【讨论】:

    【解决方案4】:

    试试这样的:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-05
      • 1970-01-01
      • 2021-08-15
      • 1970-01-01
      • 2023-03-09
      • 2011-01-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多