Пройдите по папкам и найдите файл, который нужно поместить во фрейм данных

#python #pandas #csv

#питон #панды #csv — файл #python #pandas #csv

Вопрос:

У меня есть каталог ../customer_data/* с 15 папками. Каждая папка является уникальным клиентом.

Пример: ../customer_data/customer_1

В каждой папке клиента есть файл CSV с именем surveys.csv .

ЦЕЛЬ: я хочу перебрать все папки в ../customer_data/* и найти surveys.csv для каждого уникального клиента и создать объединенный фрейм данных. Я также хочу добавить столбец в dataframe, где у него есть идентификатор клиента, который является именем папки.

 import glob
import os
rootdir = '../customer_data/*'
dataframes = []
for subdir, dirs, files in os.walk(rootdir):
    
    for file in files:
        csvfiles = glob.glob(os.path.join(rootdir, 'surveys.csv'))
        
        # loop through the files and read them in with pandas
         # a list to hold all the individual pandas DataFrames
      
        df = pd.read_csv(csvfiles)
        df['customer_id'] = os.path.dirname
        dataframes.append(df)
            
# concatenate them all together
result = pd.concat(dataframes, ignore_index=True)
result.head()

  

Этот код не дает мне все 15 файлов. Пожалуйста, помогите

Ответ №1:

Для этого вы можете использовать pathlib модуль.

 from pathlib import Path
import pandas as pd

dfs = []
for filepath in Path("customer_data").glob("customer_*/surveys.csv"):
    this_df = pd.read_csv(filepath)
    # Set the customer ID as the name of the parent directory.
    this_df.loc[:, "customer_id"] = filepath.parent.name
    dfs.append(this_df)

df = pd.concat(dfs)
  

Ответ №2:

Давайте попробуем pathlib с rglob , который будет рекурсивно искать в вашей структуре каталогов все файлы, соответствующие glob шаблону. в данном случае опрос.

 import pandas as pd 
from pathlib import Path

root_dir = Path('/top_level_dir/')

files = {file.parent.parts[-1] : file  for file in Path.rglob('*survey.csv')}

df = pd.concat([pd.read_csv(file).assign(customer=name) for name,file in files.items()])
  

Обратите внимание, что для pathlib вам понадобится Python 3.4 .