Seaborn catplot报错:Y为float却提示x/y变量均非数值求助
报错原因
- 核心问题是
RMSE和G-MEAN列存储的是列表类型而非标量数值:从你提供的DataFrame样例可以看到,两类指标分别存储为[数值]或者空列表[],直接对列表执行pd.to_numeric转换不会生效,转换后列的dtype仍为object,被Seaborn判定为非数值类型。 - 你主动将X轴的
W列转换为了category分类类型,同样不属于数值类型。Seaborn绘制柱状类分类图时要求至少有一个轴为数值类型(通常为Y轴),两轴都不满足要求时就会触发该报错。
解决方案
- 首先将列表类型的指标列转换为标量数值,空列表替换为空值:
import pandas as pd def list_to_scalar(val): # 列表长度大于0取第一个元素,否则设为空值 if isinstance(val, list): return val[0] if len(val) > 0 else pd.NA return val final_df['RMSE'] = final_df['RMSE'].apply(list_to_scalar) final_df['G-MEAN'] = final_df['G-MEAN'].apply(list_to_scalar)
- 再将指标列转换为数值类型:
final_df['RMSE'] = pd.to_numeric(final_df['RMSE'], errors='coerce') final_df['G-MEAN'] = pd.to_numeric(final_df['G-MEAN'], errors='coerce')
- 可选优化:由于
RMSE和G-MEAN分别对应不同的FEATURE类型,绘图前可先过滤对应数据避免空值干扰,比如绘制G-MEAN时只保留FEATURE = 'PD'的行:
metric = 'G-MEAN' plot_df = final_df[final_df['FEATURE'] == ('PD' if metric == 'G-MEAN' else 'PL' if metric == 'RMSE' else '')].copy()
- 后续绘图代码无需修改,直接使用处理后的DataFrame即可正常运行。
内容的提问来源于stack exchange,提问作者QueryQuasar
相关产品推荐
相关产品推荐

