使用 Pandas 清理并读取含有冗余文本的 CSV 文件

使用 Pandas 清理并读取含有冗余文本的 CSV 文件

本文将介绍如何使用 Pandas 高效处理包含非数据文本(如标题、脚注)的 CSV 文件。通过文件预处理、条件行跳过或迭代解析等多种方法,实现精确识别并加载有效表格数据,从而确保数据清洗和后续分析的准确性和效率。

在实际数据处理中,我们经常会遇到 csv 文件中包含除了表格数据之外的额外文本内容,例如文件标题、报告生成信息、脚注等。这些冗余信息会干扰 pandas 的 read_csv 函数,导致数据加载失败或数据格式错误。本教程将探讨几种有效策略,帮助您在加载这些“不规范”的 csv 文件时,准确地提取出所需的表格数据。

识别问题 CSV 文件的特征

假设我们有一个名为 students.csv 的文件,其内容示例如下:

SAMPLE FILE LTDSTUDENT NUMBERSINFO OF ALL STUDENTS No :  from 27-Mar-2023 00:00:00 to 04-Apr-2023 00:00:00 and  from 05-Oct-2023 00:00:00 to 13-Oct-2023 00:00:00Student,id,add,div,rankABC,12,USA,A,1DEF,13,IND,C,2XYZ,14,UK,E,3PQR,15,DE,F,4 This is System generated report, and needs no signature. 14-Oct-2023 18:14:12

从上述示例中可以看出,文件顶部有多行描述性文本,底部也有报告生成信息。真正的列标题 Student,id,add,div,rank 位于文件中间,且数据行紧随其后。直接使用 pd.read_csv(‘students.csv’) 会因为这些非表格数据而报错。

策略一:预先确定跳过行数并加载

这种方法适用于列标题行内容固定或可预测的情况。我们可以通过编程方式读取文件,找到列标题所在的行,然后计算出需要跳过的行数,再将这个行数传递给 pd.read_csv 的 skiprows 参数。

实现步骤:

打开文件并逐行读取。在每一行中查找预期的列标题(例如,包含“rank”字符串的行)。一旦找到,记录当前行号(即需要跳过的行数)。使用 pd.read_csv 加载数据,并通过 skiprows 参数跳过冗余行。处理可能存在的尾部冗余行,通常通过检查关键列的 NaN 值来删除。

示例代码:

import pandas as pddef get_rows_to_skip(file_name, filter_text):    """    计算需要跳过的行数,直到找到包含指定文本的行。    Args:        file_name (str): CSV 文件路径。        filter_text (str): 用于识别列标题行的关键词。    Returns:        int: 需要跳过的行数。    """    rows = 0    with open(file_name, 'r', encoding='utf-8') as file:        while True:            line = file.readline()            if not line: # 文件结束                break            if filter_text in line:                return rows            rows += 1    return 0 # 如果未找到,默认不跳过def read_cleaned_csv(file_name, header_filter_text):    """    读取并清理包含冗余文本的 CSV 文件。    Args:        file_name (str): CSV 文件路径。        header_filter_text (str): 用于识别列标题行的关键词。    Returns:        pd.DataFrame: 清理后的数据框。    """    skip_rows_count = get_rows_to_skip(file_name, header_filter_text)    # 使用 skiprows 加载数据    df = pd.read_csv(file_name, skiprows=skip_rows_count)    # 清理尾部可能存在的 NaN 行(如果文件底部也有冗余文本)    # 假设 'rank' 是数据中一定会存在的列    df = df[df[header_filter_text].notna()]    return df# 创建一个模拟的 students.csv 文件sample_content = """SAMPLE FILE LTDSTUDENT NUMBERSINFO OF ALL STUDENTS No :  from 27-Mar-2023 00:00:00 to 04-Apr-2023 00:00:00 and  from 05-Oct-2023 00:00:00 to 13-Oct-2023 00:00:00Student,id,add,div,rankABC,12,USA,A,1DEF,13,IND,C,2XYZ,14,UK,E,3PQR,15,DE,F,4 This is System generated report, and needs no signature. 14-Oct-2023 18:14:12"""with open('students.csv', 'w', encoding='utf-8') as f:    f.write(sample_content)# 调用函数读取文件df_cleaned = read_cleaned_csv('students.csv', "rank")print(df_cleaned)

输出:

  Student  id  add div  rank0     ABC  12  USA   A   1.01     DEF  13  IND   C   2.03     XYZ  14   UK   E   3.04     PQR  15   DE   F   4.0

注意: 这里的输出中,XYZ 和 PQR 的索引是 3 和 4,因为在原始文件中,DEF 后面跟着一个空行,导致 pd.read_csv 在默认情况下将空行也作为数据行加载,然后因为 rank 列为 NaN 而被 df[df[‘rank’].notna()] 过滤掉。如果需要连续索引,可以添加 df.reset_index(drop=True, inplace=True)。

策略二:将整个文件作为文本读取,然后分割、清理并转换

这种方法不依赖于 skiprows 参数,而是将整个文件内容作为字符串读取,然后手动进行分割和清理,最后再构建 DataFrame。

实现步骤:

打开文件,将所有内容读取为一个字符串。将字符串按换行符分割成行列表。将行列表转换为一个单列的 DataFrame。使用 str.split(‘,’) 将单列拆分为多列,并 expand=True。删除所有值为 NaN 的行,以去除头部和尾部的冗余文本以及空行。识别并提取列标题行,将其设置为 DataFrame 的列名。删除原始标题行,并重置索引。

示例代码:

import pandas as pdwith open('students.csv', 'r', encoding='utf-8') as file:    # 将整个文件读取为一个字符串,然后按换行符分割成行    df_raw = pd.DataFrame(file.read().split('n'))# 将单列拆分为多列,以逗号为分隔符df_split = df_raw[0].str.split(',', expand=True)# 删除所有包含 NaN 值的行,这会有效地去除头部和尾部的非数据行以及空行df_cleaned = df_split.dropna()# 假设第一行是列标题# 提取列标题new_columns = df_cleaned.iloc[0].values# 将第一行数据设置为列名df_cleaned.columns = new_columns# 删除作为列名使用的第一行数据df_final = df_cleaned.iloc[1:].reset_index(drop=True)print(df_final)

输出:

  Student  id  add div rank0     ABC  12  USA   A    11     DEF  13  IND   C    22     XYZ  14   UK   E    33     PQR  15   DE   F    4

这种方法在处理列标题位置不固定,但数据行结构相对规整的场景下非常有效。

策略三:迭代读取文件直到找到标题,然后使用 read_csv

此方法结合了文件流式读取和 Pandas 的强大功能,尤其适用于处理非常大的文件,因为它避免了一次性将整个文件加载到内存中。

实现步骤:

打开文件。逐行读取,直到找到包含预期列标题的行。将找到的标题行解析为列名。将文件句柄的剩余部分直接传递给 pd.read_csv,并指定列名。对加载的数据进行进一步的清理(例如,删除尾部可能存在的 NaN 行)。

示例代码:

import pandas as pdwith open('students.csv', 'r', encoding='utf-8') as file:    line = file.readline()    # 循环读取行,直到找到以“Student”开头的行(我们的列标题行)    while not line.startswith('Student'):        line = file.readline()        if not line: # 防止文件末尾未找到标题而陷入死循环            raise ValueError("Header line not found in the file.")    # 解析找到的标题行作为列名    column_names = line.strip().split(',')    # 将文件句柄的剩余部分传递给 pd.read_csv    # names 参数用于指定列名,因为我们已经手动解析了标题行    df = pd.read_csv(file, names=column_names)# 清理尾部可能存在的 NaN 行(如果文件底部也有冗余文本)# 假设 'rank' 是数据中一定会存在的列df_cleaned = df.dropna(subset=['rank']) # 只检查关键列print(df_cleaned)

输出:

  Student  id  add div  rank0     ABC  12  USA   A   1.01     DEF  13  IND   C   2.02     XYZ  14   UK   E   3.03     PQR  15   DE   F   4.0

这种方法特别高效,因为它只在找到标题行之后才开始由 Pandas 进行解析,并且可以处理文件末尾的额外文本,因为 dropna() 会将其清除。

注意事项与最佳实践

选择合适的识别策略: 根据您的 CSV 文件特点(头部/尾部冗余模式、文件大小、列标题的稳定性)选择最适合的清理策略。如果头部冗余行数固定或标题行模式稳定,skiprows 和迭代读取是高效的选择。如果文件大小适中且结构复杂,read().split(‘n’) 后手动处理可能更灵活。编码问题: 在打开文件时,务必指定正确的编码(如 encoding=’utf-8’),以避免乱码问题。错误处理: 在实际应用中,应增加健壮的错误处理机制,例如当预期的标题行未找到时抛出异常或记录日志。通用性: 尽量使您的清理逻辑具有通用性,能够适应文件内容的一些微小变化。例如,使用 startswith() 或 in 关键字来查找标题行,而不是精确匹配整个行。性能考量: 对于非常大的文件(GB 级别),迭代读取文件或使用 chunksize 参数分块读取会是更优的选择,以避免内存溢出。尾部清理: 文件尾部的冗余文本通常可以通过 dropna() 或根据数据特性进行行切片来处理。选择一个关键列(如 rank)来判断一行是否为有效数据,是一个常见的做法。

总结

处理含有冗余文本的 CSV 文件是数据预处理中的常见挑战。通过结合 Python 的文件 I/O 操作和 Pandas 强大的数据处理能力,我们可以灵活高效地解决这类问题。无论是通过预计算跳过行数、将文件作为文本整体处理,还是通过迭代读取文件流,核心思想都是在将数据传递给 Pandas 之前,准确地识别并隔离出真正的表格数据区域。掌握这些技巧将显著提高您数据清洗工作的效率和准确性。

以上就是使用 Pandas 清理并读取含有冗余文本的 CSV 文件的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1371935.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Python怎么将字符串转换为小写_Python字符串大小写转换技巧
上一篇 2025年12月14日 11:53:10
Pandas DataFrame:基于分组条件更新特定类型行的值
下一篇 2025年12月14日 11:53:28

相关推荐

  • 高效解决 Laravel Eloquent 关联查询中的大小写问题

    最近在开发一个 laravel 项目时,遇到了一个令人头疼的 bug。我的数据库使用了区分大小写的字符集,而 item_tag 表中的 item_uuid 字段存储的是字符串类型的 uuid。 item 模型和 tag 模型之间存在多对多关系。当我使用 item::with(‘tags’)->…

    用户投稿 2026年9月3日
    000
  • 告别支付难题:使用Softon/Indipay 简化印度支付网关集成

    在为印度市场开发一个电商应用时,我面临着一个巨大的挑战:如何高效地集成多个印度支付网关,例如ccavenue、payumoney、paytm等等。每个网关都有其独特的api和参数要求,单独集成每个网关不仅费时费力,而且容易出错。维护和更新这些集成也变得异常困难。 我最初尝试分别集成每个网关,但很快发…

    用户投稿 2026年9月3日
    200
  • 三家基础电信企业全面接入 DeepSeek开源大模型

    ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 工业和信息化部消息,2025年春节期间,我国通信网络运行稳定,通信服务持续优化,人工智能赋能成为服务创新的重要驱动力。 三大基础电信运营商已全面接入DeepSeek开源大模型,并在多个场景和产品…

    2026年9月3日
    100
  • Podman 已成 Linux 官方标配!Docker 没戏了?

    Podman 已成 Linux 官方标配!Docker 没戏了?Podman 已成 Linux 官方标配!Docker 没戏了?Podman 已成 Linux 官方标配!Docker 没戏了?Podman 已成 Linux 官方标配!Docker 没戏了?

    podman 简介 Podman 是一个开源项目,在 GitHub 上已获得超过 12,000 个星标,可以在大多数 Linux 平台上运行。Podman 是一个无守护进程的容器引擎,用于在 Linux 系统上开发、管理和运行 OCI(开放容器倡议)容器和容器镜像。Podman 提供了与 Docke…

    2026年9月3日 用户投稿
    300
  • 慧通差旅联合IDC行业首发《央国企数智化差旅管理白皮书》,解码央国企转型新动能

    6月21日,华为开发者大会2025期间,慧通差旅联合idc及百余位央国企客户、开发者、生态伙伴共聚东莞松山湖,举办“数智化转型差旅同行”专题论坛,重磅发布行业首份《央国企数智化差旅管理白皮书》(以下简称白皮书),深度解码从顶层规划到落地实施的央国企数智差旅建设之道。同步展示全新升级的差旅agent等…

    2026年9月3日
    200
  • 余承东称华为智驾在行业内断代领先 本月揭晓尊界黑科技

    华为余承东近日预告,华为鸿蒙智行将在智能驾驶领域带来革命性突破,并称其与“凑合能用”的水平有着本质区别,如同5g网络与普通网络的差异。 本月,华为将公布尊界系列的核心技术,展现智慧出行的未来图景。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜…

    2026年9月3日
    100
  • mac使用命令安装软件

    mac使用命令安装软件mac使用命令安装软件mac使用命令安装软件mac使用命令安装软件

    答案:Homebrew是macOS上高效管理命令行工具和图形应用的包管理器,通过简单命令实现软件安装、更新与卸载,支持依赖处理和Cask图形应用安装,安全可靠且可与其他语言包管理器协同使用。 在macOS上,想要通过命令来安装软件,最核心且效率最高的方式就是借助一个叫做Homebrew的包管理器。它…

    2026年9月3日 用户投稿
    300
  • Java数组中如何判断是否存在指定元素?

    Java数组元素存在性检测 在Java开发中,经常需要判断数组中是否存在特定元素。 对于对象数组,可以使用Arrays.asList()方法结合contains()方法便捷地实现;但对于基本类型数组,则需要采用迭代的方式进行查找。 基本类型数组的判断 对于boolean、int、double等基本类…

    2026年9月3日
    200
  • 如何使用 Composer 安装和升级 Magento 2 自定义模块:以 tradefurniturecompany/core 为例

    可以通过一下地址学习composer:学习地址 在处理 Magento 2 项目时,模块的安装和升级是常见任务,但有时会遇到一些挑战。例如,确保在安装或升级过程中不中断网站服务,或者正确处理依赖关系。最近,我在为 tradefurniturecompany.co.uk 项目安装 tradefurni…

    用户投稿 2026年9月3日
    200
  • 卡萨帝发布AI深度科技:实现从守护生活到守护文明的升级

    卡萨帝发布AI深度科技:实现从守护生活到守护文明的升级卡萨帝发布AI深度科技:实现从守护生活到守护文明的升级卡萨帝发布AI深度科技:实现从守护生活到守护文明的升级卡萨帝发布AI深度科技:实现从守护生活到守护文明的升级

    2025年6月25日,以“ai致远 爱不凡”为主题的卡萨帝思享荟在重庆科学会堂拉开帷幕。现场,卡萨帝正式发布“ai深度科技”,同时推出搭载该技术的“ai鉴赏家套系”。 在AI浪潮推动下,卡萨帝品牌持续进化,从“高端家电领导者”逐步迈向“艺术生活缔造者”,如今更进一步,成为“传世文明当代守护者”。活动…

    2026年9月3日 用户投稿
    100
  • 掌握HTML、CSS、JS、PHP、MySQL等技能,毕业生的求职前景如何?

    掌握HTML、CSS、JS、XAMPP、PHP和MySQL技能的毕业生,就业前景如何?这是一个许多即将毕业的大学生都关心的问题。 这位同学能够使用这些技能构建前后端网站,却对未来就业感到迷茫,只学习过一些Vue基础知识。 能否找到工作,并非简单的“是”或“否”。 这取决于多个因素:招聘岗位需求、作品…

    2026年9月3日
    200
  • 使用 Composer 简化 Laravel 中金额处理的实践

    可以通过以下地址学习composer:学习地址 在寻找解决方案的过程中,我发现了 gallop-yd/laravel-amount 这个库,它通过 Composer 可以轻松集成到 Laravel 项目中,极大地简化了金额转换的处理逻辑。 首先,通过 Composer 安装该库非常简单,只需运行以下…

    用户投稿 2026年9月3日
    100
  • Vue项目动态favicon配置失败:页面空白及js.runtime.xx.js报错如何解决?

    Vue项目动态favicon配置失败,导致页面空白并出现js.runtime.xx.js错误?本文分析问题根源并提供解决方案。 问题核心在于html-webpack-plugin插件错误地处理了JavaScript文件引入。 最初的配置使用了js[name]这样的占位符,导致Webpack无法正确加…

    2026年9月3日
    300
  • 网页空间受限时,如何巧妙实现下拉菜单折叠效果?

    巧妙解决网页空间受限:下拉菜单折叠效果 网页设计中,特别是菜单或选项列表,经常会遇到空间不足的问题。当菜单项过多超出容器宽度时,需要有效机制避免内容溢出,保持布局整洁。本文将介绍一种优雅的解决方案:在空间受限时,将超出部分折叠到下拉菜单中。 此方案的核心在于动态判断元素宽度,根据容器宽度决定哪些菜单…

    2026年9月3日
    100
  • 如何高效管理Magento 2模块:以wolfautoparts.com/product为例

    在为wolfautoparts.com维护其magento 2商店时,我面临的一个主要问题是如何高效地安装和升级其自定义模块wolfautoparts.com/product。每次更新或安装新模块时,都需要确保不影响网站的正常运行,同时还要处理与其他系统的集成问题。 在尝试了多种方法后,我发现使用C…

    用户投稿 2026年9月3日
    100
  • 三爱思获初芯基金投资,系国内半导体晶圆载具领军企业

    ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 初芯基金近日宣布独家投资三爱思半导体材料(苏州)有限公司(简称“三爱思”),推动先进半导体技术落地中国。此轮融资将用于三爱思的产品开发、技术升级、生产优化和团队建设,进一步提升其为国内客户提供高…

    2026年9月3日
    000
  • 电脑主机电源供应不足故障排查及电源更换建议

    电脑主机电源供应不足故障排查及电源更换建议电脑主机电源供应不足故障排查及电源更换建议电脑主机电源供应不足故障排查及电源更换建议电脑主机电源供应不足故障排查及电源更换建议

    电脑电源供电不足会导致系统不稳定甚至无法开机,解决方法包括排查症状、简化负载、软件检查、交叉测试和更换合适电源。首先观察高负载时是否黑屏、重启或外设异常;其次检查电源线、插座、风扇和灰尘情况;再拔掉非必要设备测试;接着用事件查看器和更新驱动辅助判断;有条件可用备用电源交叉测试;计算硬件总功耗并增加2…

    2026年9月3日 用户投稿
    100
  • 有效管理角色与权限:使用litepie/roles解决权限管理难题

    在开发一个多用户系统时,我遇到了一个常见但复杂的问题:如何有效地管理用户角色和权限。最初,我尝试使用自定义的解决方案,但发现管理起来非常繁琐,容易出错,导致系统的安全性和可维护性大打折扣。经过一番研究,我找到了litepie/roles这个强大的角色和权限管理库,它大大简化了我的工作,使得整个系统的…

    用户投稿 2026年9月3日
    000
  • 飞飞重逢飞行器全攻略:激活驾驶与极速翱翔指南

    飞飞重逢飞行器全攻略:激活驾驶与极速翱翔指南飞飞重逢飞行器全攻略:激活驾驶与极速翱翔指南飞飞重逢飞行器全攻略:激活驾驶与极速翱翔指南飞飞重逢飞行器全攻略:激活驾驶与极速翱翔指南

    你是否向往挣脱地面的桎梏,在云端自由穿梭?《飞飞重逢》的飞行器系统正是你通往天际的通行证!解锁机翼、掌控操纵杆,这份详尽指南将助你成为真正的天空霸主: 机甲觉醒:三步启动你的专属战机碎片收集 — 星空猎人的寻宝征程 深入副本挑战、参与限时活动或完成阵营任务,获取对应飞行器的独特碎片。每架飞行器都拥有…

    2026年9月3日 用户投稿
    100
  • SpreadJSx AI 深度融合:从智能函数到数据决策新范式

    SpreadJSx AI 深度融合:从智能函数到数据决策新范式SpreadJSx AI 深度融合:从智能函数到数据决策新范式SpreadJSx AI 深度融合:从智能函数到数据决策新范式SpreadJSx AI 深度融合:从智能函数到数据决策新范式

    当电子表格与大模型相遇,数据处理的边界正被彻底重塑。 在数字化转型的大潮中,电子表格作为企业最基础的数据载体,长期面临操作繁琐、分析门槛高等问题。传统函数公式的记忆负担、数据透视表的配置复杂度、跨语言协作的障碍……这些看似微小的摩擦,日积月累却严重拖慢了企业的效率。 2025年6月,纯前端表格控件S…

    2026年9月3日 用户投稿
    200

发表回复

登录后才能评论
关注微信