将不同目录中的多个.csv文件读入pandas DataFrame

时间:2016-10-03 18:42:40

标签: python csv pandas dataframe operating-system

我的DataFrame有一个索引SubjectID,每个Subject ID都有自己的目录。在每个主题目录中都有一个.csv文件,其中包含我要放入DataFrame的信息。使用我的SubjectID索引,我想读取每个主题的.csv文件的标题,并将其放入我的DataFrame中的新列。

除个别科目编号外,每个科目目录都有相同的途径。

我找到了将多个.csv文件从单个目标目录读取到pandas DataFrame中的方法,但不是从多个目录中读取。以下是我从目标目录导入多个.csv文件的一些代码:

subject_path = ('/home/mydirectory/SubjectID/')
filelist = []
os.chdir('subject_path')
for files in glob.glob( "*.csv" ) :
    filelist.append(files)

# read each csv file into single dataframe and add a filename reference column 
df = pd.DataFrame()
columns = range(1,100)
for c, f in enumerate(filelist) :
    key = "file%i" % c
    frame = pd.read_csv( (subject_path + f), skiprows = 1, index_col=0, names=columns )
    frame['key'] = key
    df = df.append(frame,ignore_index=True)

我想做类似的事情,但迭代地进入不同的主题目录,而不是只有一个目标目录。

编辑: 我想我想使用os而非pandas执行此操作,是否有办法使用循环使用os搜索多个目录?

2 个答案:

答案 0 :(得分:1)

考虑os.walk()的递归方法来读取所有目录和文件自上而下(默认= TRUE)或自下而上。此外,您可以使用正则表达式检查名称以专门过滤.csv文件。

下面将从目标根 / home / mydirectory 导入任何子/孙子文件夹中的所有csv文件。因此,请务必检查是否存在非主题csv文件,否则请相应地调整re.match()

import os, re
import pandas as pd

# CURRENT DIRECTORY (PLACE SCRIPT IN /home/mydirectory)
cd = os.path.dirname(os.path.abspath(__file__))

i = 0
columns = range(1,100)
dfList = []

for root, dirs, files in os.walk(cd):
    for fname in files:
        if re.match("^.*.csv$", fname):
            frame = pd.read_csv(os.path.join(root, fname), skiprows = 1, 
                                index_col=0, names=columns)
            frame['key'] = "file{}".format(i)
            dfList.append(frame)    
            i += 1

df = pd.concat(dfList)

答案 1 :(得分:0)

假设您的主题文件夹位于mydirectory,您只需创建目录中所有文件夹的列表,然后将csv添加到您的文件列表中。

import os

parent_dir = '/home/mydirectory'
subject_dirs = [os.path.join(parent_dir, dir) for dir in os.listdir(parent_dir) if os.path.isdir(os.path.join(parent_dir, dir))]

filelist = []
for dir in subject_dirs:
    csv_files = [os.path.join(dir, csv) for csv in os.listdir(dir) if os.path.isfile(os.path.join(dir, csv)) and csv.endswith('.csv')]
    for file in csv_files:
        filelist.append(file)

# Do what you did with the dataframe from here
...