【问题标题】:Quickest way to load multiple csvs into a dataframe将多个 csv 加载到数据框中的最快方法
【发布时间】:2019-04-27 01:28:48
【问题描述】:

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

【问题讨论】:

    标签: python pandas performance csv numpy


    【解决方案1】:

    试试这个:

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

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

    如果还不够快,请使用ThreadPoolExecutor 一次读取多个,最后连接它们。

    【讨论】:

    • 谢谢约翰!处理时间减半。
    【解决方案2】:

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

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

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

    【讨论】:

    • 抱歉,我好像没有定义“kwargs”这个名字。
    • @h.choi **kwargs 是用于解包关键字参数的 Python 约定。在您的情况下,这些是您传递给 read_csv 的可选参数,即。 (index_col = None, header = 0, low_memory = False) 等等。
    【解决方案3】:

    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)
    

    【讨论】:

    • 抱歉,我的数据一定不干净。 (它说它无法将字符串转换为浮点数:
    • @h.choi,您应该举一个数据示例as an edit to your question,这样我们就知道您的意思了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 2020-06-04
    • 2019-08-20
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多