Python Pandas:高效处理多CSV文件并统计指定列唯一值

Python Pandas:高效处理多CSV文件并统计指定列唯一值

本教程详细介绍了如何使用python pandas库高效地处理多个csv文件,并统计其中指定列(例如列’b’)的唯一值数量。文章通过实际示例演示了如何读取文件、识别并计数唯一项,最终生成一份汇总表格。此外,还探讨了如何提取每个文件中首次出现的唯一值行,为数据分析提供灵活的解决方案。

在日常数据分析工作中,我们经常会遇到需要处理大量分散在多个文件中的数据。一个常见的需求是,从一系列结构相似的CSV文件中,提取并统计某个特定列(例如,用户ID、商品SKU等)的唯一值数量。本教程将指导您如何利用Python的Pandas库高效地完成这项任务,并生成一份清晰的汇总报告。

准备工作:生成示例数据

为了更好地演示,我们首先创建一些模拟的CSV文件。这些文件将具有相同的列结构,并包含随机数据。

import numpy as npimport pandas as pdfrom glob import globimport os# 清理旧的CSV文件,确保每次运行都是新的示例for f in glob('file_??.csv'):    os.remove(f)n = 1000 # 每个文件的行数columns = list('abcde') # 列名np.random.seed(0) # 设置随机种子以保证结果可复现# 生成10个CSV文件for i in range(10):    filename = f'file_{i:02d}.csv'    pd.DataFrame(        np.random.randint(0, 1000, (n, len(columns))), # 生成随机整数数据        columns=columns,    ).to_csv(filename, index=False) # 保存为CSV,不包含索引print("已生成10个示例CSV文件:file_00.csv 到 file_09.csv")

上述代码将创建10个名为 file_00.csv 到 file_09.csv 的文件,每个文件包含5列(’a’到’e’)和1000行随机数据。我们的目标是统计每个文件中列’b’的唯一值数量。

核心任务:统计每个文件的指定列唯一值

现在,我们将实现统计每个CSV文件中列’b’的唯一值数量,并将其汇总到一个Pandas DataFrame中。

立即学习“Python免费学习笔记(深入)”;

1. 文件发现与读取

首先,我们需要找到所有目标CSV文件。glob模块是Python标准库中用于查找符合特定模式的文件路径的强大工具

# 使用glob查找所有匹配模式的CSV文件filenames = glob('file_??.csv')print(f"发现以下文件:{filenames}")

glob(‘file_??.csv’) 会匹配所有以 file_ 开头,后面跟任意两个字符,并以 .csv 结尾的文件,例如 file_00.csv, file_01.csv 等。

2. 识别与计数唯一值

对于每个文件,我们将执行以下操作:

使用 pd.read_csv() 读取文件内容。利用 duplicated([‘b’]) 方法识别列’b’中的重复值。该方法返回一个布尔Series,其中 True 表示该行在列’b’上是重复的(即,之前已经出现过相同的值),False 表示是首次出现或唯一值。通过对 ~pd.read_csv(filename).duplicated([‘b’]) 进行求和,可以统计 False 的数量,这等同于列’b’的唯一值数量。

3. 构建汇总表格

我们可以使用字典推导式遍历所有文件,将文件名作为键,唯一值数量作为值,然后将这个字典转换为Pandas Series,并进一步转换为DataFrame。

# 遍历每个文件,计算列'b'的唯一值数量distinct_counts = {    filename: (~pd.read_csv(filename).duplicated(['b'])).sum()    for filename in filenames}# 将结果转换为Pandas Series,并进一步处理为DataFramedf_summary = pd.Series(distinct_counts)                .to_frame('count')                .rename_axis(index='filename')print("n每个文件列'b'的唯一值数量汇总:")print(df_summary)

输出示例:

             countfilename          file_01.csv    645file_00.csv    613file_02.csv    617file_03.csv    626file_04.csv    623file_05.csv    644file_06.csv    615file_07.csv    628file_08.csv    645file_09.csv    636

这份 df_summary DataFrame清晰地展示了每个CSV文件中列’b’的唯一值数量。

扩展应用:提取每个文件的首个唯一值行

除了统计唯一值的数量,有时我们可能还需要获取每个文件中列’b’首次出现时的完整行数据。例如,如果列’b’代表产品ID,我们可能想获取每个产品ID在文件中首次出现时的所有相关信息。

我们可以通过 drop_duplicates() 方法来实现这一目标。结合 pd.concat(),我们可以将所有文件的结果合并成一个大型DataFrame,并保留原始文件的标识。

# 提取每个文件列'b'的首个唯一值行df_distinct_rows = pd.concat([    pd.read_csv(filename).drop_duplicates(['b'])    for filename in filenames], keys=filenames) # 使用文件名作为外部索引(MultiIndex)print("n每个文件列'b'的首个唯一值行汇总:")print(df_distinct_rows)

输出示例:

                   a    b    c    d    efile_01.csv 0    689  191  884  615  649            1     24   68  794  820  107            2    566  469  718  157  897            3    206  256  527  417  672            4    765  755  741  197  926...              ...  ...  ...  ...  ...file_09.csv 986  626  622  224  726  274            988  329  900  577   26  221            990   47  800  369  567   11            998  602  198  165  217  682            999  564  982  890  126  450[6292 rows x 5 columns]

这里的 df_distinct_rows 是一个MultiIndex DataFrame,第一层索引是文件名,第二层是原始文件中的行索引。这使得我们可以方便地追溯每条记录的来源文件。

注意事项与性能考量

内存管理: 对于非常大的CSV文件,一次性读取所有文件到内存可能会导致内存溢出。在这种情况下,可以考虑使用 pd.read_csv 的 chunksize 参数分块读取,或者使用 Dask 等专门处理大数据集的库。然而,对于本教程中统计唯一值的场景,duplicated() 或 drop_duplicates() 通常需要访问整个列的数据,因此分块读取可能需要更复杂的逻辑来维护全局的唯一性状态。文件路径与模式匹配: glob 模式应准确反映您要处理的文件命名约定。如果文件分布在不同的子目录中,可能需要调整模式或使用 os.walk 进行更复杂的遍历。列名一致性: 确保所有CSV文件都包含您要分析的目标列(例如’b’),并且列名大小写一致。否则,pd.read_csv 可能会报错或返回不正确的结果。数据类型: duplicated() 和 drop_duplicates() 对不同数据类型(字符串、数字、日期等)都能很好地工作,但要确保列的数据类型在文件中是一致的。

总结

本教程演示了如何利用Python的Pandas库高效地处理多个CSV文件,以统计指定列的唯一值数量。通过 glob 模块进行文件发现,结合 pd.read_csv、duplicated() 和 sum(),我们可以轻松地生成一份汇总报告。此外,drop_duplicates() 和 pd.concat() 的组合也为提取每个文件中首次出现的唯一值行提供了强大的解决方案。掌握这些技术将大大提高您在多文件数据处理和分析中的效率。

以上就是Python Pandas:高效处理多CSV文件并统计指定列唯一值的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月14日 23:02:55
下一篇 2025年12月14日 23:03:02

相关推荐

  • # 如何在 Jupyter Notebook 中直接读取单元格输入数据

    本文旨在讲解如何在 Jupyter Notebook 中直接读取其他单元格的输入数据,从而实现类似在线编程平台的测试用例功能。我们将探讨如何利用 IPython 提供的 `In` 和 `Out` 对象,访问已执行单元格的代码和输出结果,并提供相应的示例代码和使用注意事项。## 利用 IPython …

    2025年12月14日
    000
  • 解决Jupyter Notebook v7+中粘贴功能异常的策略与实践

    本文旨在解决Jupyter Notebook v7及更高版本中用户遇到的无法直接粘贴文本到单元格的问题。此问题通常与浏览器设置、权限或版本有关。教程将提供一系列解决方案,包括更新浏览器、使用原生右键菜单粘贴、检查剪贴板权限以及考虑环境重装,以恢复正常的粘贴功能,确保流畅的代码和文本编辑体验。 在Ju…

    2025年12月14日
    000
  • Telethon 异步编程指南:正确获取用户信息与协程处理

    在使用 telethon 库开发 telegram 客户端时,尝试获取自身信息(如 `client.get_me()`)时,常会遇到 `attributeerror: ‘coroutine’ object has no attribute ‘stringify&#…

    2025年12月14日
    000
  • IntelliJ IDEA 文件类型识别与管理指南

    JetBrains IDEs,如IntelliJ IDEA,主要通过文件名扩展名或哈希bang行来识别文件类型。本文将深入探讨IDE内部的文件类型管理机制,并提供详细的步骤,指导用户如何手动覆盖单个文件的类型,以及如何在IDE设置中配置全局文件类型映射,从而确保代码获得正确的语法高亮、智能提示和运行…

    2025年12月14日
    000
  • 使用 vgamepad 库模拟手柄按键:正确操作指南

    本文深入探讨了python `vgamepad` 库在模拟虚拟手柄按键时的一个常见问题:直接使用整数进行按键操作无效。文章阐明了 `vgamepad` 库设计上要求使用预定义的 `xusb_button` 枚举常量来确保按键模拟的正确性,并提供了详细的解释、示例代码和最佳实践,帮助开发者避免常见错误…

    2025年12月14日
    000
  • Python异常链机制深度解析:理解raise from与__cause__

    本文深入探讨Python的异常链机制,解释当一个异常在处理另一个异常时如何自动关联。我们将通过具体示例分析`During handling of the above exception`的含义,揭示Python如何通过`__cause__`属性隐式维护异常之间的联系。此外,文章还将详细介绍`rais…

    2025年12月14日
    000
  • 异步协程中控制流与资源锁的精细化管理

    在复杂的异步操作链中,当需要在嵌套协程中返回一个可等待对象,并要求资源锁在最终操作完成后才释放时,传统的 `with` 语句上下文管理器无法满足需求。本文将深入探讨此问题,并提供一种通过显式锁管理和 `asyncio.Task` 的回调机制来确保资源正确释放的解决方案,从而实现控制流的灵活转移与资源…

    2025年12月14日
    000
  • Pandas DataFrame行求和:解决混合数据类型导致0值结果的问题

    本教程旨在解决pandas dataframe在对包含混合数据类型的行进行求和时,numeric_only=true参数失效并返回0值的问题。核心解决方案是利用pd.to_numeric函数的errors=’coerce’参数,将非数值型数据安全转换为nan,然后再进行行求和…

    2025年12月14日
    000
  • 解决Polars动态API注册与Python类型检查器的兼容性问题

    本文深入探讨了在使用polars的动态api注册功能(如`@pl.api.register_expr_namespace`)时,mypy和pyright等类型检查器报告`attr-defined`错误的问题。文章分析了问题的根本原因,即python静态类型系统无法识别运行时动态添加的属性。针对此问题…

    2025年12月14日
    000
  • Python文件操作:为文本行自动添加递增序列号

    本教程详细介绍了如何使用python向现有文本文件追加新数据时,自动为其添加递增的序列号。通过利用a+文件模式、文件指针定位及f-string格式化,我们能够高效地读取当前行数并生成带有零填充的序列号,确保数据记录的完整性和可追溯性。 在许多数据记录和日志管理场景中,为每一条新记录自动添加一个递增的…

    2025年12月14日
    000
  • Python 实时数据可视化教程:Matplotlib 与 Pygame 实践

    本教程旨在解决Python中实时数据可视化的问题,特别是在使用Matplotlib进行动态图表更新时可能遇到的挑战。文章将首先详细介绍如何利用Matplotlib的交互模式高效地绘制和更新实时数据图,包括常见陷阱与优化技巧。随后,将引入Pygame作为构建高度自定义、轻量级实时图表的替代方案,并提供…

    2025年12月14日
    000
  • 如何在Pydantic中实现类级别字段的不可变性

    pydantic的`allow_mutation`配置可确保模型实例字段的不可变性。然而,对于类级别的字段,该配置无效。本文将深入探讨如何利用自定义元类(metaclass)来拦截和阻止对pydantic模型类属性的直接修改,从而实现真正的类级别不可变性,并提醒使用此高级技术时需谨慎。 在Pydan…

    2025年12月14日
    000
  • 解决Django生产环境CSRF 403错误:Nginx HTTPS配置指南

    本文旨在解决Django应用在生产环境(Nginx + Gunicorn)中遇到的CSRF 403错误,特别是当DEBUG=True时显示的“Origin checking failed”问题。核心在于Django的CSRF_COOKIE_SECURE=True设置与Nginx未正确配置HTTPS代…

    2025年12月14日
    000
  • 如何在 Python 中从 JSON 数据中提取图片 URL

    本文介绍了如何使用 Python 从包含嵌套字典的 JSON 数据中提取特定的图片 URL。通过 `requests` 库获取 JSON 数据,并使用 `get` 方法安全地访问嵌套字典中的目标值,避免因键不存在而导致的程序错误。本文提供了详细的代码示例和解释,帮助开发者轻松提取所需信息。 在使用 …

    2025年12月14日
    000
  • 优雅测试 Python input() 提示信息:解耦与实践

    本文探讨了在 `pytest` 中有效测试 `Python` `input()` 函数提示信息的方法。针对直接使用 `capsys` 或 `capfd` 捕获 `input()` 提示的局限性,文章提出了一种推荐的解决方案:将提示信息的生成逻辑从主函数中解耦,独立为一个可测试的函数。通过这种方式,可…

    2025年12月14日
    000
  • 深入理解二叉树等和分割问题

    本文旨在探讨如何判断一个二叉树是否可以通过移除一条边被分割成两个和相等的子树,并返回该和。文章首先分析了一种常见的递归解法及其潜在问题,提供了详细的修正方案,随后介绍了一种更高效的自底向上遍历算法,通过一次遍历收集所有子树和,从而在O(N)时间复杂度内解决问题,并提供了完整的Python实现代码和注…

    2025年12月14日
    000
  • 使用Pandas cummax 函数高效跟踪数据流中的累计最大值

    本文详细介绍了如何在Pandas DataFrame中高效地创建一个新列,该列能够跟踪并保留数据流中遇到的累计最大值。通过利用Pandas内置的`cummax()`函数,可以简洁而优雅地解决当序列值增加时更新最大值,并在值下降时保持前一个最大值的需求,避免了复杂的迭代或分组逻辑。 需求概述:跟踪并保…

    2025年12月14日
    000
  • Odoo Gevent 环境下 VSCode 远程调试断点不命中解决方案

    本文提供odoo在gevent环境下使用vscode进行远程调试时,断点无法命中的解决方案。核心问题源于debugpy与gevent_support=true的冲突。解决方案涉及修改vscode调试配置,移除gevent_support,并创建一个自定义python入口脚本。该脚本在debugpy启…

    2025年12月14日
    000
  • 二叉树最大路径和问题详解:深度优先搜索与双值返回策略

    本文详细探讨了二叉树最大路径和问题,这是一个经典的深度优先搜索(DFS)难题。通过引入“可连接路径和”和“全局最大路径和”两种返回值,我们能有效处理路径可能在任意节点终止或转向的情况,尤其是在节点值为负数时。教程将深入解析递归逻辑、边界条件处理以及Python实现,帮助读者掌握解决此类复杂树问题的通…

    2025年12月14日
    000
  • Python中从自定义经验累积分布函数(CDF)抽样:直接与平滑插值方法

    本文详细阐述了如何从自定义的经验累积分布函数(cdf)中生成随机样本。我们将探讨两种主要方法:一是利用numpy的`interp`函数进行基于线性插值的直接抽样,该方法高效且易于实现;二是借助scipy的`interp1d`函数,通过选择不同的插值类型(如线性、三次样条等)实现更平滑的抽样。文章将通…

    2025年12月14日
    000

发表回复

登录后才能评论
关注微信