将多个csv文件导入到pandas并连接成一个DataFrame

我想从一个目录中读取几个CSV文件到pandas,并将它们连接成一个大的dataframe。 我还没有弄明白。 这是我到目前为止:

import glob import pandas as pd # get data file names path =r'C:\DRO\DCL_rawdata_files' filenames = glob.glob(path + "/*.csv") dfs = [] for filename in filenames: dfs.append(pd.read_csv(filename)) # Concatenate all data into one DataFrame big_frame = pd.concat(dfs, ignore_index=True) 

我想我需要在for循环内的一些帮助?

如果你在所有的csv文件中有相同的列,那么你可以尝试下面的代码。 我已经添加了header=0这样在读取csv第一行后就可以分配为列名。

 path =r'C:\DRO\DCL_rawdata_files' # use your path allFiles = glob.glob(path + "/*.csv") frame = pd.DataFrame() list_ = [] for file_ in allFiles: df = pd.read_csv(file_,index_col=None, header=0) list_.append(df) frame = pd.concat(list_) 

darindaCoder的答案的另一种select:

 path = r'C:\DRO\DCL_rawdata_files' # use your path all_files = glob.glob(os.path.join(path, "*.csv")) # advisable to use os.path.join as this makes concatenation OS independent df_from_each_file = (pd.read_csv(f) for f in all_files) concatenated_df = pd.concat(df_from_each_file, ignore_index=True) # doesn't create a list, nor does it append to one 
 import glob, os df = pd.concat(map(pd.read_csv, glob.glob(os.path.join('', "my_files*.csv")))) 

编辑:我googled到https://stackoverflow.com/a/21232849/186078 。 然而,最近我发现使用numpy进行任何操作会更快,然后将其分配给数据框一次,而不是在迭代的基础上操作数据框本身,而且似乎也可以在此解决scheme中使用。

我真诚地希望任何人点击这个页面来考虑这个方法,但是不想把这个巨大的代码作为评论附加在一起,使它不那么可读。

你可以利用numpy来加速数据框的连接。

 import os import glob import pandas as pd import numpy as np path = "my_dir_full_path" allFiles = glob.glob(os.path.join(path,"*.csv")) np_array_list = [] for file_ in allFiles: df = pd.read_csv(file_,index_col=None, header=0) np_array_list.append(df.as_matrix()) comb_np_array = np.vstack(np_array_list) big_frame = pd.DataFrame(comb_np_array) big_frame.columns = ["col1","col2"....] 

计时统计:

 total files :192 avg lines per file :8492 --approach 1 without numpy -- 8.248656988143921 seconds --- total records old :1630571 --approach 2 with numpy -- 2.289292573928833 seconds --- 

如果多个csv文件被压缩,您可以使用zipfile来读取所有文件并连接如下:

 import zipfile import numpy as np import pandas as pd ziptrain = zipfile.ZipFile('yourpath/yourfile.zip') train=[] for f in range(0,len(ziptrain.namelist())): if (f == 0): train = pd.read_csv(ziptrain.open(ziptrain.namelist()[f])) else: my_df = pd.read_csv(ziptrain.open(ziptrain.namelist()[f])) train = (pd.DataFrame(np.concatenate((train,my_df),axis=0), columns=list(my_df.columns.values))) 

如果要recursionsearchPython 3.5或更高版本 ),可以执行以下操作:

 path = r'C:\user\your\path\**' all_rec = glob.iglob(os.path.join(path, "*.csv"), recursive=True) dataframes = (pd.read_csv(f) for f in all_rec) big_dataframe = pd.concat(dataframes, ignore_index=True) 

你可以在这里find**的文档。 另外,我使用iglob而不是glob ,因为它返回一个迭代器而不是一个列表。