Манипулирование кадрами данных в разных подкаталогах

#python #pandas #operating-system #glob #python-os

Вопрос:

У меня есть много подкаталогов, в которых у меня есть уникальные наборы данных. Я хочу провести некоторые манипуляции с этим 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 в этом подкаталоге.

Допустим, я хочу добиться следующего:

Сгруппируйте (подсчитайте) каждый набор данных в каждой папке по столбцу 1 и сохраните его в соответствующем подкаталоге в виде отдельного фрейма данных. Лучше называть каждый фрейм данных начальными буквами (в данном случае тест), а не его расширением (csv).

Я могу написать общую функцию о том, как группировать наборы данных, но я не знаю, как получить доступ к каждому подкаталогу. (возможно, с использованием цикла for и пакета os/glob).

Заранее спасибо.

Комментарии:

1. В папке, такой как folder1, вы хотите создать подкаталог, такой как folder1/подпапка1, чтобы сохранить свой фрейм данных?

2. Нет, я хочу манипулировать фреймами данных в каждом каталоге (folder1 и folder2) отдельно.

Ответ №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
 

Комментарии:

1. Спасибо за ваш ответ. Это работает! Один дополнительный вопрос. Если вы хотите выполнить поиск df на основе начальных символов, как бы вы указали его в glob коде.? Теперь он принимает только df на основе расширения csv. Что я также хочу дополнительно, так это взять df на основе слова «тест».

2. Вы можете попробовать что-то в этом роде: data_dir.glob('**/test_*.csv')