将多个csv加载到数据框中的最快方法

时间:2018-11-25 00:13:14

标签: python pandas performance csv numpy

我有一个包含许多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 :(得分:0)

尝试一下:

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

big_data = pd.concat(dfs)

这避免了将DataFrame转换为NumPy数组并再次返回。

如果那还不够快,请使用ThreadPoolExecutor一次读取几个,最后连在一起。

答案 1 :(得分:0)

我建议使用生成器表达式,以避免将所有数据两次加载到内存中。

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

您还可以尝试将engine='c'参数传递给阅读器,以加快处理速度。

答案 2 :(得分:0)

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)