【问题标题】:Concatenating multiple dataframes. Issue with datapaths连接多个数据帧。数据路径问题
【发布时间】:2019-10-19 23:25:18
【问题描述】:

我想连接我保存在目录./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。 提前致谢!

【问题讨论】:

  • 请包含所有import 行。您可能需要使用文件名映射文件夹路径。
  • csv 文件保存在此处:L:\Graduation\Pythonfiles\Errormeasures\venv\Errormeasure(这里我只保存我要检索的 csv 文件。),而代码位于此处:L:\Graduation\Pythonfiles\Errormeasures\venv

标签: python pandas csv concatenation glob


【解决方案1】:

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

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

import glob

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

从那里在列表理解中构建数据框(绕过 map -see 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 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)

【讨论】:

  • 太棒了!那完成了工作。你只是在你的代码的第二部分有一个错字:它必须是df_files=[pd.read_csv(f)...
  • 听起来不错。乐意效劳。哎呀! R 使用 read.csv 并错误地忘记为 Pandas 进行代码切换。
【解决方案2】:
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 循环中运行上述代码。

【讨论】:

  • 感谢您的回答。但是,我现在收到错误ValueError: No objects to concatenate。你知道解决这个问题的方法吗?
  • @jonasa 你有重复的列名吗?如果是,删除这些重复项将解决您的问题。
  • @jonasa 如果回答对你有帮助,请采纳。
  • 不在每个数据帧内。但是,不同的 df 都有相同的列名(我无法更改)
  • 更改因为它们合并在一起,或者尝试通过 np.delete(your first header) 隐式删除它们
猜你喜欢
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 2021-10-15
  • 2017-10-15
  • 2019-06-27
  • 2021-10-12
  • 1970-01-01
相关资源
最近更新 更多