首页 > 编程问答 >更改 pandas.DataFrame 的样式:永久?

更改 pandas.DataFrame 的样式:永久?

时间:2024-08-07 05:08:01浏览次数:13  
标签:python pandas jupyter-notebook pandas-styles

当我更改 pandas.DataFrame 的样式时,例如像这样

        # color these columns
        color_columns = ['roi', 'percent_of_ath']
        (portfolio_df
            .style
            # color negative numbers red
            .apply(lambda v: 'color: red' if v < 0 else 'color: black',
                   subset=color_columns)
            # color selected cols light blue
            .apply(lambda s: 'background-color: lightblue',
                    subset=color_columns))

应用于数据帧的样式不是永久的。

为了使它们保持不变,我可以将 (portfolio_df ... 部分的输出分配给同一个数据帧像这样:

portfolio_df = (portfolio_df ...

在 Jupyter Notebook 中显示这个覆盖的 portfolio_df ,我可以看到样式精美的 DataFrame。但是尝试从模块导入的函数内更改样式,我失败了。我在函数中构造 DataFrame,更改样式,从函数返回(现在)样式化的 DataFrame,将其显示在 Jupyter Notebook 中,我看到一个非样式化的 DataFrame。

编辑

检查样式操作的返回值

s = (portfolio_df.style.apply(...

我看到这个:

>>> type(s)
pandas.io.formats.style.Styler

所以该操作不返回一个DataFrame,而是一个 ...Styler 对象。我错误地认为我可以将此返回值重新分配给我的原始 DataFrame,从而覆盖它并使样式更改永久。

问题

将样式应用于 DataFrame 的操作是破坏性的还是非破坏性的破坏性操作?答案似乎是风格不会永久改变。现在,我怎样才能让它永久改变?

编辑2

查看 Pandas 的源代码,我查看了 class Styler 的文档字符串(参见[1]):

    If using in the Jupyter notebook, Styler has defined a ``_repr_html_``
    to automatically render itself. Otherwise call Styler.render to get
    the generated HTML.

所以在Jupyter中笔记本中,Styler 有一个方法可以根据应用的样式自动渲染数据帧。

否则(在 iPython 中)它会创建 HTML。

将应用的样式的返回值分配给变量

s = (portfolio_df.style.apply(...

我可以使用它在 Jupyter 笔记本中渲染新样式。

我的理解是:我无法将数据帧输出到 Jupyter 笔记本中并期望它渲染新样式。但我可以输出 s 来显示新样式。


[1] class Styler in

pandas/pandas/io/formats/style.py

Docstring,第39行。


是对的,Pandas 中的样式应用不会直接修改基础 DataFrame。它创建了一个 Styler 对象,该对象包含有关如何显示 DataFrame 的信息,包括任何应用的样式。

样式不是为了持久化而设计的。 它们旨在用于显示目的,尤其是针对 Jupyter Notebook 等环境。

如果需要在不同函数和上下文中保留样式,则需要采用不同的方法:

  1. 在函数内返回样式化对象: 不要尝试修改原始 DataFrame,而是在函数内返回 Styler 对象。然后,可以在 Jupyter Notebook 中显示此样式化对象。

```python def style_my_dataframe(df): color_columns = ['roi', 'percent_of_ath'] styled_df = (df.style .apply(lambda v: 'color: red' if v < 0 else 'color: black', subset=color_columns) .apply(lambda s: 'background-color: lightblue', subset=color_columns)) return styled_df

styled_df = style_my_dataframe(portfolio_df) styled_df # This will display the styled DataFrame in Jupyter ```

  1. 使用 HTML 表示形式: 如果需要在 Jupyter Notebook 之外使用样式,可以将 Styler 对象渲染为 HTML,然后保存或使用该 HTML。

python html_representation = styled_df.render() # Save to file: with open('styled_dataframe.html', 'w') as f: f.write(html_representation)

  1. 使用其他库进行更持久的样式设置: 如果需要更强大、更持久的样式选项,请考虑使用其他专门用于表格样式设置和导出(如 Excel 文件)的库。一些流行的选项包括:
    • XlsxWriter: 用于创建 Excel 文件,并提供广泛的格式选项。
    • Openpyxl: 用于读取和写入 Excel 文件,并支持样式设置。

请记住,Pandas 中的样式主要用于增强数据可视化和探索,而不是用于永久数据修改。选择最适合需求的方法。

标签:python,pandas,jupyter-notebook,pandas-styles
From: 56176720

相关文章

  • Python 内联函数最佳实践
    如果我有一个可以用一行表示的python函数,那么以下哪一个选项通常被认为最适合可读性和一般最佳实践?或者还有其他更好的选择吗?选项2对我来说似乎是最好的,但我是初学者,所以我不想假设任何事情。我尝试过搜索PEP8、StackOverflow和一两个博客,但我找不到任何关于python的明......
  • 在Python中抽象出具有相同接口的真实硬件和模拟设备
    我正在寻找一种更惯用或更简洁的OOP模式来实现与以下内容等效的功能。接口和实现fromabcimportABC,abstractmethodfromtypingimportoverrideclassDevice:"""Maininterfacethathideswhetherthedeviceisarealhardwaredeviceorasimulated......
  • Python Django,使用外部MSSQL数据库
    我正在尝试创建一个连接到外部MSSQL数据库以仅检索信息(只读)的django网站。这个数据库非常庞大,有数百个表。我目前可以通过在django应用程序中创建一个函数来使其工作,该函数使用connectionString并运行原始SQL查询并将其返回到pandas数据帧中。不知何故,我感觉......
  • 使用 Python 中的 Matplotlib 和时间序列索引生成奇怪的图
    我正在尝试使用Python中的Matplotlib绘制一些时间序列数据,但生成的图看起来很奇怪,我不明白为什么。这是我正在使用的代码:filtered_df=df.loc[(df.index>'2010-01-01')&(df.index<='2010-01-08')]#Plottingthedatafig,axs=plt.subplots(1,1,figsize=(12,......
  • Dash Python:通过 @callback 链接选项卡
    这个问题是下面链接的问题的扩展:DashPython:布局函数中的@Callback未被调用我有一个简单的数据框:importpandasaspddf=pd.DataFrame({'Class1':[1,2,3,4,5],'Class2':[6,7,8,9,10]})我创建了一个数据提取函数,该函数根......
  • 如何在 Python 中使用 Langchain 返回已使用的上下文以进行回答
    我已经构建了一个像这样的RAG系统:defformat_docs(docs):return"\n\n".join(doc.page_contentfordocindocs)response_schemas=[ResponseSchema(name="price",description="Price",type="float"),ResponseSchema(......
  • 如何从 python socket.sendmsg 获取套接字 Tx 时间戳
    在阅读此处、此处和此处时,我发现在Linux系统上,您可以通过设置套接字选项来请求接收和传输的数据包的时间戳。我目前可以使用SO_TIMESTAMPNS和SO_TIMESTAMPING来通过recvmsg获取Rx时间戳。使用sendmsg我不知道......
  • Python 类型注释中“|”两边是否“强制”使用空格?
    “Union运算符”|没有出现在PEP8的其他建议中的“始终被空格包围的运算符”列表中因此,应该可以将其样式设置为类似于算术运算符,并删除圆括号、方括号内的空格,或者如果该运算符比表达式中的其他运算符具有更高的优先级。在我看来,删除空格可以提高表达式......
  • ArcPro (3.2+) Python 脚本工具中从 .atbx Toolbox 相对导入本地模块
    我设置了一个库和关联的ArcGISToolbox,以便:/root├──Toolbox.atbx├──mylib│└──my_function.py├──my_tools│└──my_gp_script.py我将代码存储库的开发克隆保存在公司共享服务器上的一个位置,并在GitHub上托管一份副本。当我进行更新时,我会......
  • Python vs. R:揭秘机器学习领域的双璧
    一、引言1.1背景介绍随着大数据和人工智能技术的飞速发展,机器学习已经成为了一个热门领域。在机器学习领域,Python和R是两种广泛使用的编程语言。Python因其简洁易读的语法和强大的库支持,成为了最受欢迎的编程语言之一。而R则以其强大的统计分析和数据可视化能力,在统计学......