
本教程详细介绍了如何使用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免费学习笔记(深入)”;
首先,我们需要找到所有目标CSV文件。glob模块是Python标准库中用于查找符合特定模式的文件路径的强大工具。
# 使用glob查找所有匹配模式的CSV文件
filenames = glob('file_??.csv')
print(f"发现以下文件:{filenames}")glob('file_??.csv') 会匹配所有以 file_ 开头,后面跟任意两个字符,并以 .csv 结尾的文件,例如 file_00.csv, file_01.csv 等。
对于每个文件,我们将执行以下操作:
我们可以使用字典推导式遍历所有文件,将文件名作为键,唯一值数量作为值,然后将这个字典转换为Pandas Series,并进一步转换为DataFrame。
# 遍历每个文件,计算列'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,第一层索引是文件名,第二层是原始文件中的行索引。这使得我们可以方便地追溯每条记录的来源文件。
本教程演示了如何利用Python的Pandas库高效地处理多个CSV文件,以统计指定列的唯一值数量。通过 glob 模块进行文件发现,结合 pd.read_csv、duplicated() 和 sum(),我们可以轻松地生成一份汇总报告。此外,drop_duplicates() 和 pd.concat() 的组合也为提取每个文件中首次出现的唯一值行提供了强大的解决方案。掌握这些技术将大大提高您在多文件数据处理和分析中的效率。
以上就是Python Pandas:高效处理多CSV文件并统计指定列唯一值的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号