2016-10-03 125 views
0

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

除了个别主题号码,每个主题目录具有相同的路径。

我已经找到了从单个目标目录中读取多个.csv文件到熊猫数据框的方法,但不能从多个目录中读取。下面是一些代码,我有一种从目标目录导入多个.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) 

我想要做类似的事情,但反复进入不同主题的目录,而不是具有单一目标目录。

编辑: 我觉得我要做到这一点使用ospandas,有没有使用循环使用os通过多个目录搜索的方法吗?

+0

上面的代码是什么,我已经尝试了从单一的目录中导入的.csv,问题是,我不是确定如何适应这个从多个目录导入文件。 – MScar

+0

也许使用循环并搜索多个主题路径? –

+0

我想用'os'来做这个吗?这看起来不像是可以在熊猫中完成的 – MScar

回答

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 
... 
0

考虑的os.walk()递归方法来读取所有的目录和文件自上而下(默认= TRUE)或自下而上。另外,您可以使用regex来检查名称以专门为.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)