如何使用pandas导入多个CSV文件并将它们合并为一个DataFrame?

4

我遇到了 No objects to concatenate 的问题。我无法从主文件夹及其子目录中导入 .csv 文件以将它们连接成一个 DataFrame。我正在使用 pandas 库。以前的答案没有帮助我,所以请不要标记为重复。

文件夹结构如下:

main/*.csv
main/name1/name1/*.csv
main/name1/name2/*.csv
main/name2/name1/*.csv
main/name3/*.csv

import pandas as pd
import os
import glob

folder_selected = 'C:/Users/jacob/Documents/csv_files'
  1. 无法工作
frame = pd.concat(map(pd.read_csv, glob.iglob(os.path.join(folder_selected, "/*.csv"))))
  1. 无法工作
csv_paths = glob.glob('*.csv')
dfs = [pd.read_csv(folder_selected) for folder_selected in csv_paths]
df = pd.concat(dfs)
  1. 无法正常工作
            all_files = []
            
            all_files = glob.glob (folder_selected + "/*.csv")
            
            file_path = []
            for file in all_files:
                df = pd.read_csv(file, index_col=None, header=0)
                file_path.append(df)
                    
        frame = pd.concat(file_path, axis=0, ignore_index=False)
3个回答

7

您需要递归搜索子目录。

folder = 'C:/Users/jacob/Documents/csv_files'
path = folder+"/**/*.csv"
  1. 使用 glob.iglob
df = pd.concat(map(pd.read_csv, glob.iglob(path, recursive=True)))
  1. 使用glob.glob
csv_paths = glob.glob(path, recursive=True)
dfs = [pd.read_csv(csv_path) for csv_path in csv_paths]
df = pd.concat(dfs)
  1. 使用os.walk
file_paths = []
for base, dirs, files in os.walk(folder):
    for file in fnmatch.filter(files, '*.csv'):
        file_paths.append(os.path.join(base, file))
df = pd.concat([pd.read_csv(file) for file in file_paths])
  1. 使用 pathlib
from pathlib import Path
files = Path(folder).rglob('*.csv')
df = pd.concat(map(pd.read_csv, files))

1
非常感谢你,你让我的一天都变得美好了。我选择了第三种方法,现在它像魔法一样正常工作。 - Alex Rodrigues
很高兴能帮忙 :) @AlexRodrigues。如果有帮助的话,您可以给答案点个赞吗? - atin
是的,抱歉我刚刚忘了。再次感谢你。 - Alex Rodrigues

2

Python的pathlib是用于此类任务的工具。

from pathlib import Path

FOLDER_SELECTED = 'C:/Users/jacob/Documents/csv_files'

path = Path(FOLDER_SELECTED) / Path("main")

# grab all csvs in main and subfolders
df = pd.concat(pd.read_csv(f.name) for f in path.rglob("*.csv"))

注意:

如果CSV需要预处理,您可以创建一个read_csv函数来处理问题,并将其放置在pd.read_csv的位置。


2

这是一个很好的答案。但是,所有文件都需要在同一个目录中。另外,我想补充一点,如果要转换为pandas dataframe,则需要在末尾添加.compute(),例如df = dd.read_csv('data*.csv').compute() - David Erickson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接