You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas style.apply()报错:TypeError: 'DataFrame'对象不可调用

解决Pandas Style中出现的"DataFrame object is not callable"错误

你遇到的TypeError: 'DataFrame' object is not callable其实很好定位——问题出在df.style.apply(df_color, axis=None)这一行。Pandas的style.apply()方法要求传入的是可调用的函数,但你直接传了df_color这个DataFrame对象,程序尝试把它当成函数执行,自然就触发了这个错误。

下面给你两种可行的解决思路,你可以根据需求选择:

方法1:修正Pandas Style的使用方式

如果你想继续用Pandas Style系统,只需要把样式DataFrame包装成一个函数传给apply即可。因为当axis=None时,apply会把整个数据DataFrame传给函数,我们只需要让函数返回预先定义好的样式DataFrame就行:

empty_stock_list = [ { 'row_index': <num>, 'column_index': <num> }, ... ]
with pd.ExcelWriter(OUTPUT_FILE, engine='xlsxwriter') as writer:
    df = pd.concat([header_row, data_price], ignore_index=False, sort=False).reset_index(drop=True)
    # 初始化样式DataFrame,默认黑色字体
    df_color = pd.DataFrame('font-color: black', index=df.index, columns=df.columns)
    # 标记空库存单元格为红色字体
    for empty_stock in empty_stock_list:
        df_color.iloc[empty_stock['row_index'], empty_stock['column_index']] = 'font-color: #FF0000'
    # 定义一个返回样式DataFrame的函数
    def apply_styles(data_df):
        return df_color
    # 把函数传给apply,而不是直接传df_color
    df.style.apply(apply_styles, axis=None).to_excel(writer, sheet_name=sheet_name, index=False, header=None)

方法2:直接用XlsxWriter原生API设置格式(更高效直观)

既然你已经在用XlsxWriter作为Excel引擎,其实可以跳过Pandas Style,直接操作Workbook和Worksheet对象,这种方式更高效,也更不容易踩坑:

empty_stock_list = [ { 'row_index': <num>, 'column_index': <num> }, ... ]
with pd.ExcelWriter(OUTPUT_FILE, engine='xlsxwriter') as writer:
    df = pd.concat([header_row, data_price], ignore_index=False, sort=False).reset_index(drop=True)
    # 先把数据写入工作表
    df.to_excel(writer, sheet_name=sheet_name, index=False, header=None)
    # 获取目标工作表对象
    worksheet = writer.sheets[sheet_name]
    # 创建红色字体的格式对象
    red_font = writer.book.add_format({'font_color': '#FF0000'})
    # 遍历空库存列表,逐个设置单元格格式
    for empty_stock in empty_stock_list:
        row = empty_stock['row_index']
        col = empty_stock['column_index']
        # 注意:XlsxWriter的行列索引和Pandas iloc一致,都是从0开始
        worksheet.write(row, col, df.iloc[row, col], red_font)

额外说明

两种方法都能实现你的需求,方法2的优势是不需要依赖Pandas的Style系统,直接用XlsxWriter的原生能力,性能更好,也更适合批量设置单元格格式的场景。

内容的提问来源于stack exchange,提问作者Michael Harley

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 19:13:14