【问题标题】:permantly apply style.format to a DataFrame将 style.format 永久应用于 DataFrame
【发布时间】:2021-05-10 20:46:44
【问题描述】:

我将 style.format 应用到我在 df 中的一个列(添加逗号),但在第二次调用 df 之后——似乎 style.format 不是永久的?当我将 style.format 分配给一个变量然后调用它时,它确实有效。但是调用 df.head(5) 给了我AttributeError: 'Styler' object has no attribute 'head'

import pandas as pd
pd.set_option('display.max_rows', 10)
df = pd.read_excel('./resources/mycopy-copy.xlsx')
df <---#truncates here
df.style.format({'Number of Doses Procured': '{:,}'}) #or df = df.style.format({'Number of Doses Procured': '{:,}'})
df <---#spits out all 500 rows

【问题讨论】:

    标签: python pandas pandas-styles


    【解决方案1】:

    简短的回答是:不,没有办法“将样式永久应用于DataFrame”。

    Styling 通常是呈现(作为 HTML)之前的最后一步,尽管它可以通过链接来组合。

    df.style.anyfunction() 的结果是一个Style 对象。因此,它没有DataFrame 的方法,特别是根据您的问题.head():

    >>> type(df.style.format('${:,.2f}'))
    pandas.io.formats.style.Styler
    

    DataFrame 对任何Styler 一无所知。相反,Styler 引用了它最初用于的 DataFrame。

    您可以将样式本身应用到另一个DataFrame(使用Styler.use() 和Styler.export(),见下文)。 但是,很遗憾,这似乎不包括 .format() 定义(至少在 pandas=1.2.1 中)。

    这真的太糟糕了,因为否则,它可以很容易地为另一个 DF 重用一个样式(或 df.head(),根据您的示例):

    def neg_red(x):
        return f"color: {'red' if x < 0 else 'black'}"
    
    df = pd.DataFrame(np.random.uniform(-4, 5, (5, 3)) * 1e4)
    s = df.style.format('${:,.2f}').applymap(neg_red).highlight_max()
    s
    

    注意:assert vars(s)['data'] is df。因此,正如我上面所说,Styler 对象具有对最初使用的DataFrame 的引用 (data)(因此,当它被要求渲染时,它知道要渲染什么数据)。

    现在,您可以使用Styler 对象并将其应用于另一个DataFrame(此处为:df.head(3)):

    df.head(3).style.use(s.export())
    

    如你所见,所有的样式功能都被继承了,除了格式化!我想这是一个错误或疏忽。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-27
      • 1970-01-01
      • 1970-01-01
      • 2013-11-30
      • 1970-01-01
      • 1970-01-01
      • 2018-11-23
      • 2012-04-06
      相关资源
      最近更新 更多