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),原因通常是:- CSV文件中对应列存在非数值内容(如空值、字符串格式的数字、异常符号等);
- 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
相关产品推荐
相关产品推荐

