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

使用pd.DataFrame.style.apply()为DataFrame设置不同数字格式报错解决

问题:为DataFrame不同元素应用不同数字格式触发TypeError

你的代码如下:

import pandas as pd

# Define formatting functions
def float1(x):
    return "{:.1f}".format(x)

def float2(x):
    return "{:.2f}".format(x)

def float3(x):
    return "{:.3f}".format(x)


# Sample dataframe
df = pd.DataFrame({
    'A': [10.123, 20.345, 30.567],
    'B': [40.789, 50.901, 60.123],
    'C': [float1, float2, float3],
    'D': ['string1', 'string2', 'string3']
})

format_dict = df['C'].to_dict()

# Apply formatting functions based on values in column C
df_styled = df.style.apply(lambda x: format_dict[x.name](x), axis=1, subset=['A', 'B'])

# Apply formatting rule to column D
df_styled = df_styled.format({'D': '{}'})

# Display the styled dataframe
display(df_styled)

运行后触发错误:

TypeError: unsupported format string passed to Series.format

错误原因

lambda x: format_dict[x.name](x)中的x是每行A、B列组成的Series对象,但你定义的float1/float2/float3只能处理单个数值。将Series直接传入"{:.1f}".format()会触发类型错误,因为Python无法直接格式化Series类型。

解决方法

修改样式应用逻辑,针对每一行的单个数值调用对应行C列的格式化函数,以下是两种可行的修正方案:

方案一:逐行遍历处理

import pandas as pd

# 定义格式化函数
def float1(x):
    return "{:.1f}".format(x)

def float2(x):
    return "{:.2f}".format(x)

def float3(x):
    return "{:.3f}".format(x)

# 示例DataFrame
df = pd.DataFrame({
    'A': [10.123, 20.345, 30.567],
    'B': [40.789, 50.901, 60.123],
    'C': [float1, float2, float3],
    'D': ['string1', 'string2', 'string3']
})

# 针对A、B列,逐行应用对应C列的格式化函数
df_styled = df.style.apply(
    lambda row: [row['C'](row['A']), row['C'](row['B'])],
    axis=1,
    subset=['A', 'B']
)

# D列保持原格式
df_styled = df_styled.format({'D': '{}'})

# 显示样式化后的DataFrame
display(df_styled)

方案二:按单元格位置匹配函数

import pandas as pd

# 定义格式化函数
def float1(x):
    return "{:.1f}".format(x)

def float2(x):
    return "{:.2f}".format(x)

def float3(x):
    return "{:.3f}".format(x)

# 示例DataFrame
df = pd.DataFrame({
    'A': [10.123, 20.345, 30.567],
    'B': [40.789, 50.901, 60.123],
    'C': [float1, float2, float3],
    'D': ['string1', 'string2', 'string3']
})

# 按单元格位置匹配对应行的格式化函数
df_styled = df.style.applymap(
    lambda val, row_idx: df.loc[row_idx, 'C'](val),
    subset=['A', 'B'],
    row_idx=df.index
)

# D列保持原格式
df_styled = df_styled.format({'D': '{}'})

# 显示样式化后的DataFrame
display(df_styled)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 03:23:16