首页 > 解决方案 > 连接多个数据帧。数据路径问题

问题描述

我想连接我保存在一个目录中的几个 csv 文件./Errormeasure。为此,我使用了来自另一个线程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目录以及下面的目录中连接的 csv 文件时,./venv. 然而,这显然不方便。当我只有 csv 文件时./Errormeasure,我收到以下错误:

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

你能给我一些解决这个问题的建议吗?我正在使用pycharm。提前致谢!

标签: pythonpandascsvconcatenationglob

解决方案


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

而是考虑内置的递归glob功能(仅在Python 3.5+中可用)返回顶级和子文件夹中所有 csv 文件的完整路径。

import glob

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

从那里构建列表理解中的数据框(绕过map-请参阅列表理解与 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)

推荐阅读