我有一个包含许多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)
答案 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)