Bir dizinden pandas'a birkaç csv dosyası okumak ve bunları büyük bir DataFrame'de birleştirmek istiyorum. Yine de bunu çözemedim. İşte şimdiye kadar sahip olduğum şey:
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)
Sanırım for döngüsü içinde biraz yardıma ihtiyacım var???
Tüm csv
dosyalarınızda aynı sütunlara sahipseniz, aşağıdaki kodu deneyebilirsiniz.
Ben header=0
ekledim, böylece csv
okunduktan sonra ilk satır sütun isimleri olarak atanabilir.
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'ın cevabı]1 için bir alternatif:
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
Düzenleme: Google'da https://stackoverflow.com/a/21232849/186078 adresine girdim. Ancak son zamanlarda numpy kullanarak herhangi bir manipülasyon yapmayı ve ardından veri çerçevesinin kendisini yinelemeli olarak manipüle etmek yerine bir kez veri çerçevesine atamayı daha hızlı buluyorum ve bu çözümde de işe yarıyor gibi görünüyor.
Bu sayfaya giren herkesin bu yaklaşımı dikkate almasını içtenlikle istiyorum, ancak bu büyük kod parçasını bir yorum olarak eklemek ve daha az okunabilir hale getirmek istemiyorum.
Veri çerçevesi birleştirme işlemini gerçekten hızlandırmak için numpy'den yararlanabilirsiniz.
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"....]
Zamanlama istatistikleri:
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 ---