【问题标题】:Manipulating Dataframes in different sub directories在不同的子目录中操作数据框
【发布时间】:2021-12-21 23:50:21
【问题描述】:

我有许多子目录,其中有独特的数据集。我想单独对这个 df 做一些操作。类似于:访问每个子目录,进行操作,转到下一个目录并执行相同操作。出于说明目的,我可以提供代码:

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')

上面的代码创建了子目录,然后将示例 df 保存在该子目录中。

假设我想实现以下目标:

按column1对每个文件夹中的每个数据集进行Grouby(计数),并将其作为单独的数据框保存在相应的子目录中。最好用起始字母(在本例中为 test)而不是扩展名 (csv) 来调用每个数据帧。

我可以编写关于如何对数据集进行分类的通用函数,但我不知道如何访问每个子目录。 (可能使用 for 循环和 os/glob 包)。

提前致谢。

【问题讨论】:

  • 在folder1这样的文件夹中,你想创建一个像folder1/subfolder1这样的子目录来保存你的数据框吗?
  • 不,我想分别操作每个目录(文件夹1和文件夹2)中的数据框。

标签: python pandas operating-system glob python-os


【解决方案1】:

使用pathlib:

import pandas as pd
import pathlib

# directory where data files are stored
data_dir = pathlib.Path('data')

for csvfile in data_dir.glob('**/*.csv'):
    print(f"Processing '{csvfile.name}' in '{csvfile.parent}'")
    df = pd.read_csv(csvfile)
    # do stuff here
    out = df.groupby('column1').mean()  # mean or whatever you want
    out.to_csv(csvfile.parent / f"{csvfile.stem}_grp.csv")
    print(f"Saved as '{csvfile.stem}_grp.csv' in '{csvfile.parent}'")
    print()

输出:

Processing 'test_a.csv' in 'data/folder1'
Saved as 'test_a_grp.csv' in 'data/folder1'

Processing 'test_b.csv' in 'data/folder2'
Saved as 'test_b_grp.csv' in 'data/folder2'

目录树:

data
├── folder1
│   ├── test_a.csv
│   └── test_a_grp.csv
└── folder2
    ├── test_b.csv
    └── test_b_grp.csv

【讨论】:

  • 感谢您的回复。有用!一个额外的问题。如果您想根据起始字符搜索 df,您将如何在 glob 代码中指定它?现在它只需要基于 csv 扩展的 df 。我还想要的是基于“测试”字的 df 。
  • 你可以试试这样的:data_dir.glob('**/test_*.csv')
猜你喜欢
  • 1970-01-01
  • 2021-08-12
  • 2013-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-29
相关资源
最近更新 更多