You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

遍历子目录批量处理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

火山引擎 最新活动