串联多个数据框。数据路径问题

时间:2019-06-04 12:17:59

标签: python pandas csv concatenation glob

我想串联几个保存在目录./Errormeasure中的csv文件。为此,我使用了另一个线程https://stackoverflow.com/a/51118604/9109556

的以下回答
filepaths =[f for f in listdir('./Errormeasure')if f.endswith('.csv')]
df=pd.concat(map(pd.read_csv,filepaths))
print(df)

但是,只有当我要在./Errormeasure目录以及下面的目录./venv中都包含csv文件时,此代码才有效。但是,这显然不方便。 当我仅在./Errormeasure中包含csv文件时,收到以下错误:

FileNotFoundError: [Errno 2] File b'errormeasure_871687110001543570.csv' does not exist: b'errormeasure_871687110001543570.csv'

您能给我一些解决这个问题的技巧吗?我正在使用pycharm。 预先感谢!

2 个答案:

答案 0 :(得分:1)

使用os.listdir()仅检索文件名,而不检索相对(熊猫脚本所在的地方)或绝对级别的pandas.read_csv()所需的父文件夹。

相反,请考虑内置glob recursive 功能(仅在Python 3.5+中可用)返回顶级和子文件夹中所有csv文件的完整路径。

import glob

for f in glob.glob(dirpath + "/**/*.csv", recursive=True):
    print(f)

从那里构建列表理解中的数据帧(绕过map-参见List comprehension vs map)与pd.concat串联:

df_files = [pd.read_csv(f) for f in glob.glob(dirpath + "/**/*.csv", recursive=True)]
df = pd.concat(df_files)
print(df)

对于Python <3.5,请考虑使用os.walk() + os.listdir()来检索csv文件的完整路径:

import os
import pandas as pd

# COMBINE CSVs IN CURR FOLDER + SUB FOLDERS
fpaths = [os.path.join(dirpath, f) 
            for f in os.listdir(dirpath) if f.endswith('.csv')] + \
         [os.path.join(fdir, fld, f) 
            for fdir, flds, ffile in os.walk(dirpath) 
            for fld in flds  
            for f in os.listdir(os.path.join(fdir, fld)) if f.endswith('.csv')]

df = pd.concat([pd.read_csv(f) in for f in fpaths])
print(df)

答案 1 :(得分:0)

import pandas as pd
import glob

path = r'C:\Directory' # use your path
files = glob.glob(path + "/*.csv")

list = []

for file in files:
    df = pd.read_csv(file, index_col=None, header=0)
    list.append(df)

frame = pd.concat(list, axis=0, ignore_index=True)

也许您需要使用'\'代替'/'

file = glob.glob(os.path.join(your\\path , '.csv'))
print(file)

您可以在for循环上运行以上代码。