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

心靈之曲
发布: 2025-11-20 13:05:02
原创
571人浏览过

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

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

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

准备工作:生成示例数据

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

import numpy as np
import pandas as pd
from glob import glob
import 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。

千帆大模型平台
千帆大模型平台

面向企业开发者的一站式大模型开发及服务运行平台

千帆大模型平台 35
查看详情 千帆大模型平台
# 遍历每个文件,计算列'b'的唯一值数量
distinct_counts = {
    filename: (~pd.read_csv(filename).duplicated(['b'])).sum()
    for filename in filenames
}

# 将结果转换为Pandas Series,并进一步处理为DataFrame
df_summary = pd.Series(distinct_counts) \
               .to_frame('count') \
               .rename_axis(index='filename')

print("\n每个文件列'b'的唯一值数量汇总:")
print(df_summary)
登录后复制

输出示例:

             count
filename          
file_01.csv    645
file_00.csv    613
file_02.csv    617
file_03.csv    626
file_04.csv    623
file_05.csv    644
file_06.csv    615
file_07.csv    628
file_08.csv    645
file_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    e
file_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文件并统计指定列唯一值的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号