複数のcsvファイルをpandasに取り込み、1つのDataFrameに連結する。

あるディレクトリから複数のcsvファイルをpandasに読み込み、それらを1つの大きな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ファイルに同じ列がある場合は、以下のコードを試してみてください。 ここでは、csv を読み込んだ後、最初の行に列名を割り当てることができるように、header=0 を追加しています。

import pandas as pd
import glob

path = r'C:\DRO\DCL_rawdata_files' # use your path
all_files = glob.glob(path + "/*.csv")

li = []

for filename in all_files:
    df = pd.read_csv(filename, index_col=None, header=0)
    li.append(df)

frame = pd.concat(li, axis=0, ignore_index=True)
解説 (5)

darindaCoder's answer]1に代わるものです。

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
解説 (2)

https://stackoverflow.com/a/21232849/186078][1]をググってみました。 しかし、最近では、データフレーム自体を繰り返し操作するよりも、numpyを使ってあらゆる操作を行い、それを一度データフレームに代入した方が早いと感じており、今回のソリューションでもそれが機能しているようです。

このページをご覧になった方には、この方法を検討していただきたいと心から思っていますが、この巨大なコードをコメントとして添付して、読みにくくなるのは避けたいと思っています。

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 ---
解説 (4)