使用Plotly Express绘制马萨诸塞州事故地图时遇类型拼接错误
问题原因与修复方案
错误的核心原因是你用了dtype = object强制把所有列都转换成了字符串类型,但Plotly绘制地图时,经度(LON)、纬度(LAT)必须是数值类型,同时用于颜色映射的NUMB_FATAL_INJR和控制标记大小的NUMB_VEHC也需要是数值,字符串类型会触发类型运算错误。
修复步骤
方案1:移除全局字符串强制转换(推荐)
直接去掉pd.read_csv里的dtype = object参数,让pandas自动推断列的正确类型:
import plotly.express as px import pandas as pd # 移除dtype=object,让pandas自动推断列类型 data = pd.read_csv("2023_Crashes.csv", on_bad_lines='warn') fig = px.scatter_mapbox(data, lon='LON', lat='LAT', zoom=10, color='NUMB_FATAL_INJR', size='NUMB_VEHC', width=1200, height=900, title='Car Accidents' ) # 别忘了显示图表 fig.show()
方案2:手动指定列类型(如果需要保留部分列的字符串类型)
如果你的数据里有其他列必须是字符串,单独指定这些列的类型,而全局不设置dtype=object:
import plotly.express as px import pandas as pd # 只把需要保留字符串的列指定为object,数值列让pandas自动推断 # 比如假设"ACCIDENT_ID"是字符串列,其他列自动推断 data = pd.read_csv("2023_Crashes.csv", on_bad_lines='warn', dtype={"ACCIDENT_ID": object}) fig = px.scatter_mapbox(data, lon='LON', lat='LAT', zoom=10, color='NUMB_FATAL_INJR', size='NUMB_VEHC', width=1200, height=900, title='Car Accidents' ) fig.show()
方案3:处理脏数据(如果坐标列存在非数值内容)
如果你的LON/LAT列里混有非数值字符串,需要先清洗转换:
import plotly.express as px import pandas as pd data = pd.read_csv("2023_Crashes.csv", on_bad_lines='warn') # 转换LON和LAT为数值,无法转换的设为NaN并删除对应行 data['LON'] = pd.to_numeric(data['LON'], errors='coerce') data['LAT'] = pd.to_numeric(data['LAT'], errors='coerce') data = data.dropna(subset=['LON', 'LAT']) # 同样处理颜色和大小的列 data['NUMB_FATAL_INJR'] = pd.to_numeric(data['NUMB_FATAL_INJR'], errors='coerce') data['NUMB_VEHC'] = pd.to_numeric(data['NUMB_VEHC'], errors='coerce') fig = px.scatter_mapbox(data, lon='LON', lat='LAT', zoom=10, color='NUMB_FATAL_INJR', size='NUMB_VEHC', width=1200, height=900, title='Car Accidents' ) fig.show()
另外,代码里可以直接用列名字符串(比如lon='LON')代替data['LON'],写法更简洁。
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

