Самый быстрый способ загрузить несколько CSV-файлов в кадре данных - PullRequest
0 голосов
/ 25 ноября 2018

У меня есть папка, которая содержит много CSV (100+), и каждый CSV содержит много строк.

Я использую следующий код для загрузки CSV во фрейм данных, но это занимает достаточно много времени,Какой самый быстрый способ загрузить эти данные?

import os
import glob
import sqlite3
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

path = '/Users/DATA'
all_files = glob.glob(os.path.join(path,'*.csv'))

np_array_list = []
for file_ in all_files:
    df = pd.read_csv(file_, index_col = None, header = 0, low_memory = False,
                     usecols = [1, 6, 7, 8, 9, 10, 11, 14, 16, 17, 22, 23])
    np_array_list.append(df.as_matrix())

comb_np_array = np.vstack(np_array_list)
big_data = pd.DataFrame(comb_np_array)

Ответы [ 3 ]

0 голосов
/ 25 ноября 2018

Я рекомендую использовать выражение генератора, чтобы избежать двойной загрузки всех данных в память.

dfs = (pd.read_csv(file_, **kwargs) for file_ in all_files)
pd.concat(dfs)

Вы также можете попробовать передать аргумент engine='c' читателю, чтобы немного ускорить процесс.

0 голосов
/ 25 ноября 2018

np.loadtxt

Если вы хотите использовать NumPy и ваши данные чисты, вы можете вообще обойти pd.read_csv:

all_files = glob.glob(os.path.join(path,'*.csv'))
cols_to_use = [1, 6, 7, 8, 9, 10, 11, 14, 16, 17, 22, 23]

arr = np.vstack([np.loadtxt(fn, delimiter=',', usecols=cols_to_use) for fn in all_files])
df = pd.DataFrame(arr)
0 голосов
/ 25 ноября 2018

Попробуйте:

dfs = []
for file_ in all_files:
    df = pd.read_csv(...)
    dfs.append(df)

big_data = pd.concat(dfs)

Это позволяет избежать превращения ваших фреймов данных в массивы NumPy и обратно.

Если это все еще недостаточно быстро, используйте ThreadPoolExecutor читать по нескольку за раз, конкатать их в конце.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...