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

seaborn kdeplot报错TypeError:变量类型不符的原因及解决方法

问题分析与解决:seaborn kdeplot触发TypeError

原始代码

import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
f = open('/Users/justkiddings/Desktop/Python/TKO/TKO.csv', ) # open the file

data = pd.read_csv(f) # read the .csv file
co=data['CO']
no2=data['NO2']  # set the data

sns.kdeplot(co,shade=True) # to make a figure of CO
sns.kdeplot(no2,shade=True) # to make a figure of NO2
plt.show()

报错信息

运行上述代码触发TypeError,错误回溯如下:

runfile('/Users/justkiddings/Desktop/Python/Code/untitled18.py', wdir='/Users/justkiddings/Desktop/Python/Code')
Traceback (most recent call last):

  File "/Users/justkiddings/opt/anaconda3/lib/python3.9/site-packages/spyder_kernels/py3compat.py", line 356, in compat_exec
    exec(code, globals, locals)

  File "/Users/justkiddings/Desktop/Python/Code/untitled18.py", line 11, in <module>
    sns.kdeplot(co,shade=True) # to make a figure of CO

  File "/Users/justkiddings/opt/anaconda3/lib/python3.9/site-packages/seaborn/_decorators.py", line 46, in inner_f
    return f(**kwargs)

  File "/Users/justkiddings/opt/anaconda3/lib/python3.9/site-packages/seaborn/distributions.py", line 1762, in kdeplot
    p._attach(ax, allowed_types=["numeric", "datetime"], log_scale=log_scale)

  File "/Users/justkiddings/opt/anaconda3/lib/python3.9/site-packages/seaborn/_core.py", line 1125, in _attach
    raise TypeError(err)

TypeError: The x variable is categorical, but one of ['numeric', 'datetime'] is required

数据样例

DATE,HOUR,STATION,CO,FSP,NO2,NOX,O3,RSP,SO2
1/1/2022,1,TSEUNG KWAN O,67,29,17,18,125,47,4
1/1/2022,2,TSEUNG KWAN O,68,31,18,18,119,50,5
1/1/2022,3,TSEUNG KWAN O,67,35,16,16,116,47,5
1/1/2022,4,TSEUNG KWAN O,66,30,14,15,112,46,4
1/1/2022,5,TSEUNG KWAN O,67,25,14,14,102,47,4

报错原因

  • sns.kdeplot()是用于绘制连续数值型数据的核密度图,要求输入的x变量必须是数值型(numeric)或日期时间型(datetime)。
  • 报错显示CO和NO2列被识别为分类数据类型(categorical),原因通常是:
    1. CSV文件中对应列存在非数值内容(如空值、字符串格式的数字、异常符号等);
    2. pandas读取数据时自动推断类型出错,将本应是数值的列判定为分类类型。

解决方法

1. 强制转换数据类型并处理异常值

读取数据后,将CO和NO2列强制转为数值型,同时将非数值内容转为NaN并可选删除:

import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns

# 直接用pd.read_csv读取,无需手动open文件
data = pd.read_csv('/Users/justkiddings/Desktop/Python/TKO/TKO.csv')

# 转换为数值型,errors='coerce'将非数值转为NaN
data['CO'] = pd.to_numeric(data['CO'], errors='coerce')
data['NO2'] = pd.to_numeric(data['NO2'], errors='coerce')

# 可选:删除包含NaN的行(如果存在)
data = data.dropna(subset=['CO', 'NO2'])

co = data['CO']
no2 = data['NO2']

sns.kdeplot(co, shade=True, label='CO')
sns.kdeplot(no2, shade=True, label='NO2')
plt.legend()
plt.show()

2. 排查原始数据

打开CSV文件检查CO和NO2列:

  • 确认所有行的对应字段都是纯数字,无空单元格、空格、字母(如"NA")或其他非数字字符;
  • 若存在异常值,直接在CSV中修正后再读取。

3. 读取时指定数据类型

如果确定数据都是数值,读取时直接指定列类型,避免pandas自动推断错误:

data = pd.read_csv(
    '/Users/justkiddings/Desktop/Python/TKO/TKO.csv',
    dtype={'CO': float, 'NO2': float}
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 12:55:17