【python】合并具有相同数字前缀的 CSV 文件

一、问题

有一个文件目录,目录下有类似下列文件名:1_a.csv、1_b.csv、1_c.csv、2_a.csv、2_b.csv、2_c.csv......即下划线前面数字相同的不同csv文件有几个,他们的行数相同,列名不同。

想把这个目录下,数字相同的几个文件都合并成1个文件,例如:1_a.csv、1_b.csv、1_c.csv合并成1.csv,2_a.csv、2_b.csv、2_c.csv合并成2.csv......

二、实现

为了合并具有相同数字前缀的 CSV 文件,需要遵循以下步骤:
1. 读取目录中所有的文件名。
2. 根据文件名中的数字前缀进行分类。
3. 合并具有相同数字前缀的 CSV 文件到一个新的 CSV 文件中。
下面是实现上述步骤的 Python 脚本:

import os
import pandas as pd# 目标目录
directory = "/home/test/datas"
directory_d = "/home/test/d"files = os.listdir(directory)
sorted_files = {}#print(files)# 对文件分类,基于数字前缀
for file in files:if file.endswith('.csv'):prefix = file.split('_')[0]sorted_files.setdefault(prefix, []).append(file)# 合并具有相同前缀的文件
for prefix, file_list in sorted_files.items():dataframes = []for filename in file_list:filepath = os.path.join(directory, filename)df = pd.read_csv(filepath)dataframes.append(df)# 可以假设所有数据列相同,并按顺序相同,如果不是这样,需要进行额外处理merged_df = pd.concat(dataframes, axis=1)# 处理合并后的数据列中可能存在的重复merged_df = merged_df.loc[:,~merged_df.columns.duplicated()]# 保存新的合并文件merged_filename = f"{directory_d}/{prefix}.csv"merged_df.to_csv(merged_filename, index=False)print(f"{directory_d}/{prefix}.csv");print("合并完成.")

这个脚本将按照数字前缀合并所有的 CSV 文件,最后将它们保存为一个新的文件(例如 1.csv,其中包含了所有 1_*.csv 的合并数据)。该脚本假设每组文件的列数相同,仅列名称不同,并且每个文件具有相同的行顺序。合并时使用了 concat 函数,去除了重复的列名(如果存在)。

三、代码解释

这段代码是一个Python脚本,用于合并指定目录下的多个CSV文件。以下是代码的详细解释:

  1. 导入必要的库:

    • os: 用于与操作系统交互,例如读取目录内容。
    • pandas as pd: 用于数据处理和分析的库,特别是DataFrame操作。
  2. 定义目标目录:

    • directory = "/home/test/tdx_datas_min": 这是源目录,其中包含要合并的CSV文件。
    • directory_d = "/home/test/d": 这是目标目录,合并后的CSV文件将保存在这里。
  3. 获取目录中的文件列表:

    • files = os.listdir(directory): 使用os.listdir函数获取directory目录下的所有文件名。
  4. 基于数字前缀对文件进行分类:

    • 循环遍历所有文件。
    • 如果文件以.csv结尾,则使用_作为分隔符获取文件名的第一个部分(数字前缀),并将该文件添加到具有相同前缀的列表中。
  5. 合并具有相同前缀的文件:

    • 循环遍历每个前缀及其对应的文件列表。
    • 对于每个文件,读取其内容并将其存储为一个pandas DataFrame。
    • 所有具有相同前缀的文件的内容都存储在一个列表中。
    • 使用pd.concat函数按列(axis=1)合并这些数据框。这意味着它将尝试将具有相同列名的列合并在一起。
    • 使用merged_df.loc[:,~merged_df.columns.duplicated()]处理可能存在的重复列名,删除重复的列。
  6. 保存合并后的文件:

    • 使用前缀作为新文件名的一部分,将合并后的数据框保存为CSV文件在目标目录中。
  7. 输出信息:

    • 打印“合并完成.”表示操作已完成。

注意事项:

  • 这个脚本假设所有要合并的CSV文件都有相同的列,并且列的顺序也是相同的。如果不是这样,合并操作可能会导致错误或意外的结果。在实际应用中,可能需要更多的检查和处理步骤来确保合并的正确性。

四、代码段1的解释

代码段1

f"{directory_d}/{prefix}.csv"

解释

这是一个Python字符串格式化的例子。在Python中,使用f-string(格式化字符串字面量)可以方便地插入变量的值到字符串中。

f"{directory_d}/{prefix}.csv" 的意思是:

  • {directory_d}:这个位置将被 directory_d 变量的值替代。
  • {prefix}:这个位置将被 prefix 变量的值替代。
  • .csv:这个部分是一个固定的字符串,表示文件的后缀名。

所以,如果 directory_d 的值是 /home/data,而 prefix 的值是 20230917,那么整个字符串的值将是 /home/data/20230917.csv

五、代码段2的解释

代码段2

merged_df = merged_df.loc[:,~merged_df.columns.duplicated()] 

解释

这句代码使用了Pandas库的几个功能来删除重复的列。

  1. merged_df.columns: 返回一个包含DataFrame所有列名的Index对象。
  2. merged_df.columns.duplicated(): 对列名进行判断,返回一个布尔值的Series,其中重复的列名对应的位置为True,不重复的列名对应的位置为False。
  3. ~: 逻辑非操作符。它反转布尔值的Series,所以重复的列名对应的位置变为False,不重复的列名对应的位置变为True。
  4. merged_df.loc[:, ~merged_df.columns.duplicated()]: 使用loc函数选择那些在上述布尔Series中为True的列,即不重复的列。

这句代码的作用是删除merged_df中重复的列。

六、代码段3的解释

代码段3

or file in files:if file.endswith('.csv'):prefix = file.split('_')[0]sorted_files.setdefault(prefix, []).append(file) 

解释

这段代码主要是对一个文件列表进行分类,基于文件名中的特定前缀。

  1. for file in files::这是一个for循环,遍历files列表中的每一个文件名。

  2. if file.endswith('.csv')::检查当前文件名是否以.csv结尾。这通常用来确定一个文件是否为CSV格式。

  3. prefix = file.split('_')[0]:这里使用split方法来分割文件名。假设文件名是prefix_data.csv,那么split('_')会返回一个列表,如['prefix', 'data.csv']。然后通过索引[0]获取第一个元素,即文件名前面的部分(前缀)。

  4. sorted_files.setdefault(prefix, []).append(file)

    • sorted_files是一个字典,用于存储不同前缀的文件列表。
    • setdefault(prefix, []):如果字典中已经有了键prefix,则返回其对应的值(一个列表)。如果字典中没有这个键,则添加一个新键并为其分配一个空列表作为值。
    • .append(file):将当前文件名添加到与前缀对应的列表中。

这段代码的目的是将所有以.csv结尾的文件按照其文件名中的前缀进行分类,并将这些文件存储在sorted_files字典中,其中键是前缀,值是具有相同前缀的文件列表。

七、代码段4的解释

代码段4

for prefix, file_list in sorted_files.items():dataframes = []for filename in file_list:filepath = os.path.join(directory, filename)df = pd.read_csv(filepath)dataframes.append(df)  

解释

这段代码主要负责读取每个文件并将其内容存储为一个pandas DataFrame,然后将其添加到一个列表中。

  1. for prefix, file_list in sorted_files.items()::这是一个for循环,遍历sorted_files字典中的键值对。其中,prefix是键(前缀),file_list是值(具有相同前缀的文件列表)。
  2. dataframes = []:初始化一个空列表,用于存储每个文件的内容作为一个DataFrame。
  3. for filename in file_list::对于每个文件名,执行以下操作。
  4. filepath = os.path.join(directory, filename):使用os.path.join函数连接目录路径和文件名,得到完整的文件路径。
  5. df = pd.read_csv(filepath):使用pandas的read_csv函数读取CSV文件,并将其内容存储为一个DataFrame。
  6. dataframes.append(df):将这个DataFrame添加到dataframes列表中。

这段代码的目的是读取每个文件的内容,并将其存储为一个DataFrame,然后将这些DataFrame添加到dataframes列表中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/602935.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

YOLOv5改进 | 损失篇 | VarifocalLoss密集检测专用损失函数 (VFLoss,论文一比一复现)

一、本文介绍 本文给大家带来的是损失函数改进VFLoss损失函数,VFL是一种为密集目标检测器训练预测IoU-aware Classification Scores(IACS)的损失函数,我经过官方的版本将其集成在我们的YOLOv8的损失函数使用上,其中有很多使用的小细节(否则按照官方的版本使用根本拟合不了…

讨好自己的五大法宝,让生活更精彩

在这个繁忙的世界里,让生活更精彩并不难,关键是你愿不愿意给自己一点小惊喜。让我们一起探讨一下,如何用五大小法宝,讨好自己,让生活更加美好。 1. 每周安排“自己时间” 在繁忙的工作和学习之余,留出每周…

echart图表

首先我们要知道ECharts是什么,它是怎么用的? ECharts是一个使用JavaScript实现的开源可视化库,它涵盖各行业图表,满足各种需求。它提供了丰富的图表类型和交互能力,使用户能够通过国简单的配置生成各种各样的图表,包括…

使用opencv做双目测距(相机标定+立体匹配+测距)

最近在做双目测距,觉得有必要记录点东西,所以我的第一篇博客就这么诞生啦~ 双目测距属于立体视觉这一块,我觉得应该有很多人踩过这个坑了,但网上的资料依旧是云里雾里的,要么是理论讲一大堆,最后发现还不知…

钡铼分布式IO在玻璃制造中的实时数据采集与监控应用介绍

导读 玻璃行业多年来一直广泛使用 PLC 来帮助管理生产过程所需的精确材料比例,完全依赖其PLC进行数据采集与控制,并且大量依靠人工来操作,所以这些高成本推动了对成本较低的替代方案的需求。 场景描述 某玻璃厂生产的玻璃生产包括配料段、熔…

Debezium发布历史49

原文地址: https://debezium.io/blog/2019/02/19/reliable-microservices-data-exchange-with-the-outbox-pattern/ 欢迎关注留言,我是收集整理小能手,工具翻译,仅供参考,笔芯笔芯. 使用发件箱模式进行可靠的微服务数…

开源框架 MIT 是什么是否可以商用

MIT开源协议是一种宽松的开源许可证,允许软件在保留版权和许可证声明的前提下,免费使用、复制、修改、合并、出版、分发、再授权和销售等。该许可证适用于几乎所有类型的软件,包括商业软件和专有软件。MIT许可证的底层原理是,通过…

React(2): 使用 html2canvas 生成图片

使用 html2canvas 生成图片 需求 将所需的内容生成图片div 中包括 svg 等 前置准备 "react": "^18.2.0","react-dom": "^18.2.0","html2canvas": "^1.4.1",实现 <div ref{payRef}></div>const pa…

servlet+jdbc+jsp实现登录界面的验证(基于MVC思想)

一、MVC的概念 MVC是模型(Model)和视图(View)以及控制器(Controller)的简写&#xff0c;是一种将数据、界面显示和业务 逻辑进行分离的组织方式&#xff0c;这样在改进界面及用户交互时&#xff0c;不需要重新编写业务逻辑&#xff0c;从而提高了 代码的可维护性。 M&#xf…

如何在Linux上安装使用达芬奇DaVinci-Resolve视频剪辑|附带格式转换脚本

如何在openSUSE-Linux上安装DaVinci-Resolve 您是否还在等待Adobe套件在Linux上的到来&#xff1f;您是否曾多次尝试通过Wine使用Premiere&#xff1f;您是否还在想苹果为什么不以Linux本机版本发布Final Cut Pro&#xff1f; 如果您对所有这些问题中的一个或全部回答是&…

K8S学习指南(65)-Operator介绍

文章目录 引言什么是 Operator&#xff1f;Operator 的优势1. 自动化操作2. 定制资源3. 增强运维功能4. 增强 K8S 原生 API Operator 的优缺点优点&#xff1a;1. 自动化运维2. 定制资源3. 跨平台性4. 增强 K8S API缺点&#xff1a;1. 学习成本2. 复杂性3. 需要专业知识 Operat…

C 字符串替换方法

/* 功能&#xff1a;将str字符串中的oldstr字符串替换为newstr字符串 * 参数&#xff1a;str&#xff1a;操作目标 oldstr&#xff1a;被替换者 newstr&#xff1a;替换者 * 返回值&#xff1a;返回替换之后的字符串 * */ std::string BaseUtil::strrpc(char *str,char *oldst…

浅析观察者模式在Java中的应用

观察者模式&#xff08;Observer Design Pattern&#xff09;,也叫做发布订阅模式&#xff08;Publish-Subscribe Design Pattern&#xff09;、模型-视图&#xff08;Model-View&#xff09;模式、源-监听器&#xff08;Source-Listener&#xff09;模式、从属者&#xff08;D…

AI绘画Midjourney绘画提示词Prompt大全

一、Midjourney绘画工具 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭…

高版本ant-design动态引用icon

需求 最近在更新自己的博客系统&#xff0c;从 vue2 升到 vue3&#xff0c;同步的也把 ant-design 从 1.7.8 跨越多个大版本升级到了 4.0.8&#xff0c;发现菜单上的 icon 报错了。 查询官方文档发现自从 2.0 版本以后的 icon 就不再支持通过 <a-icon /> 组件动态 type…

uniapp 文字超出多少字,显示收起全文按钮效果demo(整理)

收起展开 <template><view class"font30 color000 mL30 mR30"><text :class"showFullText ? : clamp-text">{{ text }}</text><view v-if"showToggleBtn && text.length > 42" click"toggleShowFu…

Python:类型标注解决循环引用问题most likely due to a circular import

两个模块&#xff0c;我们需要做类型标注&#xff0c;于是出现了循环引用的问题 # models.py from controllers import BookControllerclass Book:def get_controller(self) -> BookController:return BookController(self)# controllers.py from models import Bookclass …

基于多目标粒子群算法的支配解求解,基于多目标粒子群的帕累托前沿求解,基于mopso的多目标求解,基于mopso+bp的多目标求解资源

目录 摘要 测试函数shubert 粒子群算法的原理 粒子群算法的主要参数 粒子群算法原理 基于多目标粒子群算法的支配解求解,基于多目标粒子群的帕累托前沿求解,基于mopso的多目标求解,基于mopso+bp的多目标求解资源 代码 结果分析 展望 代码下载:基于多目标粒子群算法的支配解…

Github 2024-01-07 开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2024-01-07统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目4Jupyter Notebook项目2Go项目2C#项目1Starlark项目1非开发语言项目1Java项目1 跨平台应用程序UI框…

qt信号和槽

Qt是一个跨平台的C图形用户界面应用框架 91年奇趣科技开发 pro工程文件介绍 .pro就是工程文件(project)&#xff0c;它是qmake自动生成的用于生产makefile的配置文件 QT core gui //Qt包含的模块greaterThan(QT_MAJOR_VERSION, 4): QT widgets //大于4版本包含…