将style.format永久应用于数据帧

2024-09-26 22:10:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我在df中的一列上应用了style.format(添加逗号),但在第二次调用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

Tags: offormatnumberdfobjectstyleheadrows
1条回答
网友
1楼 · 发布于 2024-09-26 22:10:11

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

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

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

>>> type(df.style.format('${:,.2f}'))
pandas.io.formats.style.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())

正如您所看到的,除了格式化功能之外,所有的样式功能都被继承了!我认为这是一个错误或疏忽

相关问题 更多 >

    热门问题