Jeg vil gjerne lese flere csv-filer fra en katalog inn i pandas og sette dem sammen til én stor DataFrame. Jeg har imidlertid ikke klart å finne ut av det. Her er hva jeg har så langt:
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)
Jeg antar at jeg trenger litt hjelp i for-sløyfen????
Hvis du har de samme kolonnene i alle csv
-filene dine, kan du prøve koden nedenfor.
Jeg har lagt til header=0
slik at etter å ha lest csv
kan første rad tilordnes som kolonnenavn.
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)
Et alternativ til darindaCoder's svar:
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
Edit: Jeg googlet meg frem til https://stackoverflow.com/a/21232849/186078. Men i det siste finner jeg det raskere å gjøre noen manipulasjon ved hjelp av numpy og deretter tilordne den en gang til datarammen i stedet for å manipulere datarammen selv på en iterativ basis, og det ser ut til å fungere i denne løsningen også.
Jeg vil oppriktig at alle som treffer denne siden skal vurdere denne tilnærmingen, men vil ikke legge ved denne enorme koden som en kommentar og gjøre den mindre lesbar.
Du kan utnytte numpy for å få fart på dataramme-sammenkoblingen.
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"....]
Tidsstatistikk:
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 ---