【问题标题】:Import multiple nested csv files and concatenate into one DataFrame导入多个嵌套的 csv 文件并连接成一个 DataFrame
【发布时间】:2019-07-15 14:22:18
【问题描述】:

我正在尝试读取具有相同结构(列名)并位于多个文件夹中的多个 CSV 文件,我的主要目的是将这些文件连接到一个熊猫数据框中。 请在下面找到文件夹的文件位置分布,因此每个文件夹包含 5 个 CSV 文件。 是否有任何预定义的功能或技巧可以提供帮助??

【问题讨论】:

标签: python pandas csv dataframe concatenation


【解决方案1】:

您可以使用glob.glob('*.csv') 查找所有 csv,然后将它们全部连接起来。

import glob
import pandas as pd

csv_paths = glob.glob('*.csv')
dfs = [pd.read_csv(path) for path in csv_paths]
df = pd.concat(dfs)

【讨论】:

    【解决方案2】:

    使用os.walk()pd.concat()

    import os
    import pandas as pd
    outdir = [YOUR_INITIAL_PATH]
    df_final = pd.DataFrame(columns=['column1', 'column2', 'columnN']) # creates an empty df with the desired structure
    for root, dirs, filenames in os.walk(outdir):
        for f in filenames:
            if f.endswith('.csv'):
                df_temp = pd.read_csv(root + '\\' + f)
                df_final = pd.concat([df_final, df_temp])
    

    【讨论】:

    • @ikbelbenabdessamad,除了文件扩展名之外,没有限制读取文件数量的条件。我会检查你的代码上的一些事情:1)路径不是一个列表,它是一个字符串。这在您的代码 sn-p 中不清楚; 2)如果您使用的是 Windows,我更喜欢使用转义的反斜杠:path = 'C:\\Users\\benabdi1\\CsvFilesProjects\\RoomData\\2016';
    • 3) 仅当目标目录中有其他文件时才应进行文件扩展名比较。如果您没有,最好删除 if,一旦您可能遇到不同的情况(例如.XLS)。 4)你是不是用pd.read_excel()改变了pd.read_csv()方法?
    【解决方案3】:

    您可以使用os.walk() 来遍历目录树中的文件 (example)。 pd.read_csv() 会将单个文件读入数据帧。 pd.concat(df_list) 会将 df_list 中的所有数据帧连接在一起。

    为了您的方便,我不相信有一种方法可以结合以上所有内容。

    【讨论】:

      【解决方案4】:

      Frenzy Kiwi 给了你正确的答案。另一种方法是使用dask,假设您的文件夹结构是

      data
      ├── 2016
      │   ├── file01.csv
      │   ├── file02.csv
      │   └── file03.csv
      ├── 2017
      │   ├── file01.csv
      │   ├── file02.csv
      │   └── file03.csv
      └── 2018
         ├── file01.csv
         ├── file02.csv
      

      然后你可以通过阅读所有这些

      import dask.dataframe as dd
      import pandas as pd
      
      df = dd.read_csv("data/*/*.csv")
      # convert to pandas via
      df = df.compute()
      

      【讨论】:

        【解决方案5】:

        这是解决这个问题的最佳方法:

        import os
        import glob
        import pandas as pd
        
        
        def nested_files_to_df(path,ext): 
        
            paths = []
            all_data = pd.DataFrame()
        
            #--- Putting all files name  in one list ---#
        
            for root, dirs, files in os.walk(path):
                for file in files:
                    if file.endswith(tuple(ext)):
                        s = os.path.join(root, file)
                        paths.append(s)
        
            #--- Reading and merging all the  existing  excel files  into one  dataframe  ---#
        
            for f in paths:
                df = pd.read_excel(f)     
                all_data = all_data.append(df,ignore_index=True)
        
            return all_data
        

        调用函数:

        df= nested_files_to_df('Your main folder root',[".xls",".XLS",".xlsx"])
        

        【讨论】:

          猜你喜欢
          • 2014-01-21
          • 2014-01-21
          • 1970-01-01
          • 2021-04-03
          • 1970-01-01
          • 2020-02-05
          相关资源
          最近更新 更多