【问题标题】:Reading multiple csv files, concatenate list of file names them into a singe DataFrame读取多个 csv 文件,将文件名列表连接到单个 DataFrame
【发布时间】:2016-03-13 18:03:12
【问题描述】:

我在目录中有多个 csv 文件,我会循环遍历 csv 文件,找到文件名列表并读取每个文件名并将它们连接到一个数据帧中。单的情况下,只需读入数据集即可。

以下是我的目录中的 csv 文件示例:

  • 2013_nba.csv
  • 2014_nba.csv
  • 2015_nba.csv
  • 2013_basketball.csv
  • 2014_basketball.csv
  • 2015_soccer.csv

这是我目前所拥有的。但这基本上会读取所有 csv 文件并将它们连接到单个 DF 中。我需要帮助一个如何循环查找字符串列表(csv)

path = 'C:\\Users\csvfiles\\'
csvFiles = glob.glob(path + "/*.csv")

list_ = []

for files in csvFiles:
     df = pd.read_csv(files, index_col=None, header=0)
     list_.append(df)

frame = pd.concat(list_, ignore_index=True)

我是 python 的新手,我尝试执行“for "nba" in files”来提取所有名称为 "nba" 的 csv 文件,然后制作一个 DF,但没有成功。

【问题讨论】:

    标签: python csv pandas dataframe


    【解决方案1】:

    更新:

    get_merged_csv()函数的一点改进版本,可以将参数传递给pd.read_csv()

    import os
    import glob
    import pandas as pd
    
    def get_merged_csv(flist, **kwargs):
        return pd.concat([pd.read_csv(f, **kwargs) for f in flist], ignore_index=True)
    
    path = 'C:/Users/csvfiles'
    fmask = os.path.join(path, '*nba*.csv')
    
    df = get_merged_csv(glob.glob(fmask), index_col=None, usecols=['rank', 'name'])
    
    print(df.head())
    

    旧版本

    import os
    import glob
    import pandas as pd
    
    path = 'C:/Users/csvfiles'
    #fmask = '*.csv'
    
    def get_merged_csv(path, fmask):
        return pd.concat([pd.read_csv(f, index_col=None, header=0)
                          for f in glob.glob(os.path.join(path, fmask))]
               )
    
    df_list = [get_merged_csv(path, fmask)
               for fmask in ['*nba.csv', '*basketball.csv', '*soccer.csv']]
    

    df_list 将拥有三个 DF:df_list[0] - NBA,df_list[1] - 篮球,df_list[1] - 足球

    您也可以将它们放入字典中:

    df_dict = {}
    df_dict['nba'] = get_merged_csv(path, '*nba.csv')
    df_dict['basketball'] = get_merged_csv(path, '*basketball.csv')
    df_dict['soccer'] = get_merged_csv(path, '*soccer.csv')
    

    一些解释:

    get_merged_csv(path, fmask) 函数在 list comprehension 循环中读取 CSV 文件,此 DF 列表将传递给 pd.concat() 函数,该函数将返回单个连接的 DF

    【讨论】:

    • 我正在寻找 3 个不同的 df,一个用于所有文件包含“nba”,另一个用于“篮球”,最后一个用于“足球”。你所做的只是为 'nba' csv 文件制作
    • 这项工作非常完美,非常感谢。你介意解释一下这是如何工作的吗?我也意识到读取 csv 文件以“*nba.csv”或“*basketball.csv”结尾只是为了将来如果我有文件名“2014_nba_usa.csv”和“2014_basket_usa.csv”我会怎么做这是因为这两个文件都以“usa.csv”结尾。最好的方法是做“*nba_usa.csv”,或者有没有办法从文件名中间取“nba”
    • 如果我问的没有意义,那很好:) 我只是想学习,为了未来。非常感谢!
    • @MahmutKilic,当然,您可以简单地指定另一个文件掩码:'*basket*.csv*nba*.csv 等。
    • 太棒了!再次感谢您!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 2018-04-25
    • 2021-04-05
    • 2014-01-21
    相关资源
    最近更新 更多