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

如何使用pandas DataFrame追踪定位TSV文件导入后的数据错误?

解决方法

你遇到的是TSV单行字段数超出表头定义列数的异常检测问题,默认pd.read_csv遇到这类行时会直接抛出解析错误,无法直接用shape属性检测行内多余值,可以通过以下两种方案实现需求:

方案1:预扫描原始TSV文件检测(推荐,可直接获取原始行号、完整异常内容)

先不通过pandas读入,直接逐行读取原始文件,对比每行的字段数和表头定义的预期字段数,直接收集异常信息:

import pandas as pd

input_file = "你的目标TSV文件路径"
bad_records = []

# 先读取表头确定预期列数
with open(input_file, 'r', encoding='utf-8') as f:
    header_line = f.readline().strip()
    expected_cols = len(header_line.split('\t'))
    # 逐行校验剩余内容
    for line_num, content in enumerate(f, start=2): # 行号从2开始计数,表头为第1行
        content = content.strip()
        if not content:
            continue
        current_cols = len(content.split('\t'))
        if current_cols > expected_cols:
            extra_values = content.split('\t')[expected_cols:]
            bad_records.append({
                "异常行号": line_num,
                "原始行内容": content,
                "多余值列表": extra_values
            })

运行完成后bad_records会存储所有存在多余值的行的完整信息,可直接打印或导出为校验报告。

方案2:读入DataFrame时同步捕获异常

如果需要同时正常导入有效数据到DataFrame,可以自定义异常行处理函数,通过on_bad_lines参数传入pd.read_csv:

bad_records = []
expected_cols = 3 # 你的预定义列数,这里示例是3列

def catch_bad_line(line: list):
    # line为当前异常行拆分后的所有字段列表
    extra_values = line[expected_cols:]
    bad_records.append({
        "原始字段列表": line,
        "多余值列表": extra_values
    })
    # 返回前N个有效字段,该行会正常加入DataFrame;返回None则跳过该行
    return line[:expected_cols]

df = pd.read_csv(
    input_file,
    delimiter='\t',
    header=0,
    encoding='utf-8',
    on_bad_lines=catch_bad_line
)

运行完成后df为清洗后的标准DataFrame,bad_records存储所有异常信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 05:15:02