あるディレクトリから複数の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)
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
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 ---