遍历子目录批量处理DataFrame:分组统计并保存结果的实现方法问询
遍历子目录处理DataFrame并保存分组结果
我有多个子目录,每个子目录里存放着唯一的数据集。我需要对每个子目录中的DataFrame分别执行数据操作,流程是:访问每个子目录、执行数据操作、切换到下一个子目录重复流程。
我已经能创建示例目录和数据(如下代码),也能编写分组统计的通用函数,但不清楚如何遍历访问每个子目录,希望能得到解决方案。
示例创建代码:
import pandas as pd import numpy as np import os os.mkdir('folder1') d = {'column1': ['a', 'a', 'b', 'b', 'c'], 'column2': [10, 8, 6, 4, 2], 'column3': [1, 2, 3, 4, 5]} test_a = pd.DataFrame(data=d) test_a.to_csv('folder1/test_a.csv') os.mkdir('folder2') g = {'column1': ['a', 'a', 'b', 'b', 'c'], 'column2': [10, 8, 6, 4, 2], 'column3': [1, 2, 3, 4, 5]} test_b = pd.DataFrame(data=g) test_b.to_csv('folder2/test_b.csv')
我的具体需求:对每个文件夹中的数据集按column1列执行Groupby(计数)操作,并将结果以独立DataFrame的形式保存至对应子目录,文件名用原文件的前缀(比如示例中的test)而非扩展名。
解决方案
你可以结合os.walk()或者glob.glob()来遍历子目录,下面给出两种可行的实现方式,都能完美满足你的需求:
方法一:使用os.walk()递归遍历目录
os.walk()会逐层遍历目录树,返回当前目录路径、子目录列表和文件列表,非常适合处理多层目录的场景:
import pandas as pd import os def group_and_save(file_path, save_dir): # 读取目标CSV文件 df = pd.read_csv(file_path) # 按column1分组并统计每组数量,reset_index把分组列转为普通列 grouped_df = df.groupby('column1').size().reset_index(name='count') # 提取原文件的前缀(比如test_a.csv -> test_a) file_prefix = os.path.splitext(os.path.basename(file_path))[0] # 拼接保存路径,确保结果存回原子目录 save_path = os.path.join(save_dir, f"{file_prefix}_grouped.csv") # 保存分组结果,关闭索引输出 grouped_df.to_csv(save_path, index=False) print(f"已完成处理并保存:{save_path}") # 遍历当前目录下的所有目录结构 for root, dirs, files in os.walk('.'): # 跳过当前根目录,只处理子目录 if root == '.': continue # 遍历当前子目录下的所有CSV文件 for file in files: if file.endswith('.csv'): full_file_path = os.path.join(root, file) # 调用处理函数,将结果保存到当前子目录 group_and_save(full_file_path, root)
方法二:使用glob.glob()快速匹配目标文件
glob.glob()支持通配符匹配,代码更简洁,适合结构清晰的目录场景:
import pandas as pd import glob import os def group_and_save(file_path): df = pd.read_csv(file_path) # 执行分组计数操作 grouped_df = df.groupby('column1').size().reset_index(name='count') # 获取文件所在的子目录路径 save_dir = os.path.dirname(file_path) # 提取原文件前缀 file_prefix = os.path.splitext(os.path.basename(file_path))[0] # 拼接保存路径 save_path = os.path.join(save_dir, f"{file_prefix}_grouped.csv") grouped_df.to_csv(save_path, index=False) print(f"已完成处理并保存:{save_path}") # 匹配所有子目录下的CSV文件,/*/*.csv表示当前目录下的一级子目录中的CSV for csv_file in glob.glob('./*/*.csv'): group_and_save(csv_file)
关键细节说明
- 分组操作:示例中用
groupby('column1').size()统计每组的行数,如果你需要统计非空值数量,可以替换成count();也可以根据需求添加其他聚合操作,比如sum('column2')。 - 路径处理:用
os.path.join()拼接路径可以避免跨平台的路径分隔符问题(Windows用\,Linux/macOS用/),让代码更通用。 - 文件名处理:
os.path.splitext()会把文件名拆分成前缀和扩展名,完美提取你需要的原文件前缀。
这样就能自动遍历所有子目录,批量处理每个CSV文件,把分组结果存回对应子目录里啦!
内容的提问来源于stack exchange,提问作者Avto Abashishvili




