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
相关产品推荐
相关产品推荐

