Εισαγωγή πολλαπλών αρχείων 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 η πρώτη γραμμή να μπορεί να εκχωρηθεί ως τα ονόματα των στηλών.

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:

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)

Επεξεργασία: Έψαξα στο Google για να βρω το δρόμο μου προς το https://stackoverflow.com/a/21232849/186078. Ωστόσο, τελευταία βρίσκω ότι είναι πιο γρήγορο να κάνω οποιονδήποτε χειρισμό χρησιμοποιώντας 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)