pandas .render()类型错误:第一个参数必须是可调用的

xzv2uavs  于 2023-03-06  发布在  其他
关注(0)|答案(1)|浏览(157)

有人好心地帮我创建了下面这个格式精美的表格(来自这篇文章):

import numpy as np
import pandas as pd
import locale

money = [10000000, 2200000000, 10241100000.4521, 20224400000.75895]
honey = [30.6427984591421, 9584.28792256921, 37008.6603, 211200.2304295]
ltrs = ["a", "b", "a", "c"]
YRMO = ["202211", "202210", "202211", "202210"]
org = ['Main','Main', 'Jr', 'Jr']
df = pd.DataFrame(
    zip(money, honey, ltrs, YRMO, org), columns=["money", "honey", "ltrs", "YRMO", "org"]
)

YRMOs = sorted(set(df["YRMO"]))

pivot = df.pivot_table(
    values=["money", "honey"],
    index="ltrs",
    columns=["YRMO"],
    aggfunc={"money": np.sum, "honey": np.sum},
    margins=True,
    margins_name="Total",
)
pivot = pivot.drop("Total", axis=1, level=1)
pivot = pivot.fillna(0)

pivot["Var 1"] = pivot["money"][max(YRMOs)] - pivot["money"][min(YRMOs)]
pivot["Var 2"] = pivot["honey"][max(YRMOs)] - pivot["honey"][min(YRMOs)]

def color(val):
    global color
    if val[0] == '$' and float(val[1:].replace(",", "")) >1000:
        color = 'red'
    else:
        color = 'green'
    return f'color: {color}'

locale.setlocale(locale.LC_ALL, "us_US.UTF-8")

pivot = pivot.applymap(lambda x: locale.currency(val=x, grouping=True, symbol=True)).apply(lambda x: x.str.replace(pat=r"\.\d{2}",repl="", regex=True))

pivot = pivot.style.applymap(color, subset=['Var 1', 'Var 2'])

html_pivot = pivot.render()

但是如果我将相同的逻辑/函数应用于同一程序中的后续不同表/ Dataframe ,如下所示:

pivot2 = df[df['org'] == 'Jr'].pivot_table(
    values=["money", "honey"], 
    index="ltrs", 
    columns=['YRMO'], 
    aggfunc={"money": np.sum, "honey": np.sum},
    margins = True,
    margins_name = 'Total'
)

pivot2 = pivot2.drop("Total", axis=1, level=1)
pivot2 = pivot2.fillna(0)

pivot2["Var 1"] = pivot2["money"][max(YRMOs)] - pivot2["money"][min(YRMOs)]
pivot2["Var 2"] = pivot2["honey"][max(YRMOs)] - pivot2["honey"][min(YRMOs)]

pivot2 = pivot2.applymap(lambda x: locale.currency(val=x, grouping=True, symbol=True)).apply(lambda x: x.str.replace(pat=r"\.\d{2}",repl="", regex=True))

pivot2 = pivot2.style.applymap(color, subset=['Var 1', 'Var 2'])#\

html_pivot = pivot2.render()

当我尝试在程序中呈现()第二个表时,我得到了以下结果:
TypeError:第一个参数必须是可调用的
感谢您帮助了解和排 debugging 误。
我格式化和渲染这些表格发送在html电子邮件。

y4ekin9u

y4ekin9u1#

当你在pivot2上调用applymap时,你作为参数传递的color变量指向一个字符串,而不是函数color,因此错误消息显示applymap只接受一个可调用对象。
如果删除函数color中的global color和/或避免对不同对象使用相同的color名称(这会导致variable shadowing),则代码可以正常工作。
我建议两者都做,就像这样:

def color_for(val):
    if val[0] == "$" and float(val[1:].replace(",", "")) > 1000:
        color = "red"
    else:
        color = "green"
    return f"color: {color}"

...
pivot = pivot.style.applymap(color_for, subset=["Var 1", "Var 2"])

...
pivot2 = pivot2.style.applymap(color_for, subset=["Var 1", "Var 2"])

相关问题