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

Python读取Excel遇'Unknown format code "f"'报错,求排查解决

报错解决:Unknown format code 'f' for object of type 'str'

错误原因

这个错误出现在df3_melted["perc_label"] = df3_melted["y"].apply(lambda x: f"{x:.2f}")这一行,核心原因是**y列中存在字符串类型的值**,而:.2f是专门用于格式化数值(int/float)的格式符,无法处理字符串。

虽然你已经通过pd.to_numeric转换目标列并执行了dropna,但仍可能存在以下问题:

  • 转换时errors='coerce'将部分无法识别的内容转为NaN,但dropna仅删除包含NaN的行,若原Excel中存在特殊格式的文本值(比如带空格的数字、非数值符号),可能未被完全转换,残留的字符串会导致后续格式化失败。
  • melt操作后,y列意外混入非数值数据(比如原表格中隐藏的文本标识)。

解决方法

方法1:彻底确保y列为数值类型

在格式化前再次对y列执行数值转换和清理,从根源消除字符串:

# 再次强制转换为数值,无法转换的设为NaN
df3_melted["y"] = pd.to_numeric(df3_melted["y"], errors="coerce")
# 删除y列仍为NaN的行(按需选择,若允许空值可跳过)
df3_melted.dropna(subset=["y"], inplace=True)
# 执行格式化
df3_melted["perc_label"] = df3_melted["y"].apply(lambda x: f"{x:.2f}")

方法2:格式化时添加类型判断

在lambda表达式中先判断值的类型,避免对字符串执行数值格式化:

df3_melted["perc_label"] = df3_melted["y"].apply(
    lambda x: f"{x:.2f}" if isinstance(x, (int, float)) else ""
)

方法3:使用pandas内置格式化函数

更简洁安全的方式,利用pandas的序列方法处理:

# 方式一:结合非空判断格式化
df3_melted["perc_label"] = df3_melted["y"].map(lambda x: f"{x:.2f}" if pd.notna(x) else "")
# 方式二:先保留两位小数再转字符串
df3_melted["perc_label"] = df3_melted["y"].round(2).astype(str)

完整修正代码示例

df3 = f.parse('b_wa', skiprows=3, nrows=14, usecols='A:H')
df3['WAIT_ASSESSMENT'] = pd.to_numeric(df3['WAIT_ASSESSMENT'], errors='coerce')
df3['ROLL_WAIT_ASSESSMENT'] = pd.to_numeric(df3['ROLL_WAIT_ASSESSMENT'], errors='coerce')
df3.dropna(inplace=True)
df3_melted = df3.melt('Month', var_name='Metric', value_name='y')

# 新增:确保y列完全为数值类型
df3_melted["y"] = pd.to_numeric(df3_melted["y"], errors="coerce")
df3_melted.dropna(subset=["y"], inplace=True)

df3_melted["perc_label"] = df3_melted["y"].apply(lambda x: f"{x:.2f}")
for i, row in df3_melted.iterrows():
    if i != 0 and i != len(df3) - 1 and i != len(df3) and i != len(df3_melted) - 1:
        df3_melted.at[i, "perc_label"] = ""
df_monthly = df3_melted[df3_melted["Metric"] == "WAIT_ASSESSMENT"]
df_12_month = df3_melted[df3_melted["Metric"] == "ROLL_WAIT_ASSESSMENT"]
range_ = ["#003f5c", "#ffa600"]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 03:15:41