【问题标题】:How to import multiple csv files and concatenate into one DataFrame using pandas如何使用 pandas 导入多个 csv 文件并连接到一个 DataFrame
【发布时间】:2021-04-03 20:37:15
【问题描述】:

我有问题No objects to concatenate。我无法从 main 及其子目录导入 .csv 文件以将它们连接到一个 DataFrame 中。我正在使用熊猫。旧答案对我没有帮助,所以请不要标记为重复。

文件夹结构是这样的

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)

【问题讨论】:

    标签: python pandas dataframe csv


    【解决方案1】:

    如下检查Dask Library,它将多个文件读取到一个df中

    >>> import dask.dataframe as dd
    >>> df = dd.read_csv('data*.csv')
    

    阅读他们的文档 https://examples.dask.org/dataframes/01-data-access.html#Read-CSV-files

    【讨论】:

    • 这是一个很好的答案。但是,所有文件都需要位于同一目录中。另外,我会添加它以转换为熊猫数据框,您需要在末尾添加.compute(),例如df = dd.read_csv('data*.csv').compute()
    【解决方案2】:

    您需要递归搜索子目录。

    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))
    

    【讨论】:

    • 非常感谢。你让我今天一整天都感觉很好。我选择了第三种方法,现在它就像一个魅力。
    • 乐于助人 :) @AlexRodrigues。如果它对您有帮助,您可以为答案投票吗?
    • 是的,抱歉我忘了。再次感谢您。
    【解决方案3】:

    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 的位置

    【讨论】:

      猜你喜欢
      • 2014-01-21
      • 2014-01-21
      • 2020-02-05
      • 1970-01-01
      • 2019-07-15
      • 1970-01-01
      相关资源
      最近更新 更多