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

使用Plotly与Pandas绘制LIDAR数据拟合线时遇ValueError报错求助

解决LIDAR数据绘图时的DataFrame列数不匹配错误

错误原因

报错ValueError: 2 columns passed, passed data had 3 columns是因为你创建DataFrame时指定了2列(['x','y']),但new_master列表中存在包含3个元素的行,导致列数不匹配。

代码问题分析

  1. 冗余代码:temp_list相关代码完全未使用,可直接删除。
  2. 数据处理逻辑缺陷:
    • 手动用csv.reader读取时,未过滤格式异常的行(比如部分行多了逗号分隔符)。
    • 循环中反复判断数据长度并绘图,会导致重复执行绘图操作,效率极低。
  3. 未利用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 20:55:50