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

使用经纬度数据集绘制散点图遇TypeError报错求助

解决plt.scatter绘制经纬度散点图时出现TypeError: nan is not a string的问题

没错,你猜的很准——这个错误大概率和数据里的NaN值有关,但还有一种常见情况是你的经纬度列里混了字符串类型的无效值(比如写成'NaN'的文本,而不是numpy原生的NaN),导致matplotlib没法正常解析数值。下面是一步步的排查和解决方法:

第一步:先排查数据问题

先确认你的经纬度列的数据类型,以及是否存在缺失值或字符串无效值:

# 查看数据类型
print(raw[['LATITUDE', 'LONGITUDE']].dtypes)
# 统计NaN数量
print(raw[['LATITUDE', 'LONGITUDE']].isna().sum())
# 检查是否有字符串类型的无效值
print(raw[raw['LATITUDE'].apply(lambda x: isinstance(x, str))])

如果输出里看到列的类型是object(字符串),或者存在大量字符串形式的无效值,那就是问题根源了。

第二步:清洗数据

根据排查结果选择对应的处理方式:

情况1:数值型NaN(列类型是float/int,存在原生NaN)

直接删除含NaN的行,或者用合理值填充(比如均值、中位数,根据你的数据场景选择):

# 删除含缺失值的行
cleaned = raw.dropna(subset=['LATITUDE', 'LONGITUDE'])

# 或者用均值填充(示例)
# cleaned = raw.copy()
# cleaned['LATITUDE'] = cleaned['LATITUDE'].fillna(cleaned['LATITUDE'].mean())
# cleaned['LONGITUDE'] = cleaned['LONGITUDE'].fillna(cleaned['LONGITUDE'].mean())

情况2:字符串类型的无效值(比如'NaN'、'N/A'文本)

先把列转换成数值型,同时把无法转换的字符串强制转为NaN,再处理缺失值:

cleaned = raw.copy()
# 将列转为数值型,无法转换的内容转为NaN
cleaned['LATITUDE'] = pd.to_numeric(cleaned['LATITUDE'], errors='coerce')
cleaned['LONGITUDE'] = pd.to_numeric(cleaned['LONGITUDE'], errors='coerce')
# 删除含NaN的行
cleaned = cleaned.dropna(subset=['LATITUDE', 'LONGITUDE'])

第三步:重新绘制散点图

用清洗后的数据集绘制,另外注意:常规地图坐标是先经度后纬度,这样展示的结果更符合地理习惯:

latitude = cleaned['LATITUDE'].values
longitude = cleaned['LONGITUDE'].values
plt.scatter(longitude, latitude)
plt.xlabel('Longitude')
plt.ylabel('Latitude')
plt.show()

补充说明

为什么会出现这个错误?
当pd.read_csv读取到混有数值和字符串的列时,会默认把列识别为object类型(字符串)。而matplotlib的scatter函数需要纯数值型数据,当遇到无法转换为数值的字符串(比如'NaN'文本),就会抛出TypeError: nan is not a string的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:47:23