使用Plotly与Pandas绘制LIDAR数据拟合线时遇ValueError报错求助
解决LIDAR数据绘图时的DataFrame列数不匹配错误
错误原因
报错ValueError: 2 columns passed, passed data had 3 columns是因为你创建DataFrame时指定了2列(['x','y']),但new_master列表中存在包含3个元素的行,导致列数不匹配。
代码问题分析
- 冗余代码:
temp_list相关代码完全未使用,可直接删除。 - 数据处理逻辑缺陷:
- 手动用
csv.reader读取时,未过滤格式异常的行(比如部分行多了逗号分隔符)。 - 循环中反复判断数据长度并绘图,会导致重复执行绘图操作,效率极低。
- 手动用
- 未利用pandas的csv读取能力:pandas内置的
read_csv可以自动处理绝大多数csv格式问题,比手动读取更可靠。
修复方案
方案一:用pandas直接读取(推荐)
这是处理csv数据最简洁高效的方式,无需手动解析:
import pandas as pd import plotly.express as px # 读取csv文件,指定列名(如果文件无表头) df = pd.read_csv('lidar03.csv', names=['x', 'y']) # 若只需用前1000行绘图(可根据需求调整) df_sample = df.head(1000) # 绘制散点图并添加lowess拟合线 fig = px.scatter(df_sample, x='x', y='y', trendline="lowess") fig.show()
方案二:保留手动读取逻辑并修复问题
如果必须使用csv.reader,需添加异常行过滤,并调整绘图时机:
import pandas as pd import plotly.express as px import csv new_master = [] def grab_plot(): with open('lidar03.csv', 'r') as f: reader = csv.reader(f) for row in reader: # 只保留包含2个元素的有效行,过滤异常行 if len(row) == 2: new_master.append(row) else: print(f"发现异常行(列数不符):{row}") # 读取完所有数据后再处理绘图 if len(new_master) > 1000: # 取前1000行数据绘图 df = pd.DataFrame(new_master[:1000], columns=['x', 'y']) fig = px.scatter(df, x='x', y='y', trendline="lowess") fig.show() else: print("数据行数不足1000") grab_plot()
额外说明
- 对于28万行的大数据,建议先采样(比如取前1000行或随机采样)再绘图,避免内存占用过高。
- 若原csv文件包含表头,需在
read_csv中添加header=0参数,无需指定names。
内容的提问来源于stack exchange,提问作者Garberchov
相关产品推荐
相关产品推荐

