我的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
搜索多个目录?
答案 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
...