【问题标题】:speed up the process of import multiple csv into python dataframe加快将多个csv导入python数据框的过程
【发布时间】:2016-07-12 13:37:52
【问题描述】:

我想将目标目录中的多个 CSV 文件(数百个文件,每个数百行,但列数相同)读取到单个 Python Pandas DataFrame 中。

我写的下面的代码可以运行,但是太慢了。运行 30 个文件需要几分钟(所以如果我加载所有文件,我应该等待多长时间)。我可以改变什么让它更快地工作?

此外,在replacefunction 中,我想将“_”(不知道编码,但不是正常的)替换为“-”(正常的 utf-8),我该怎么办那?我使用coding=latin-1因为我的文件中有法语口音。

#coding=latin-1

import pandas as pd
import glob

pd.set_option('expand_frame_repr', False)

path = r'D:\Python27\mypfe\data_test'
allFiles = glob.glob(path + "/*.csv")
frame = pd.DataFrame()
list_ = []
for file_ in allFiles:
    df = pd.read_csv(file_, index_col = None, header = 0, sep = ';', dayfirst = True, 
                     parse_dates=['HeurePrevue','HeureDebutTrajet','HeureArriveeSurSite','HeureEffective'])
    df.drop(labels=['aPaye','MethodePaiement','ArgentPercu'],axis=1,inplace=True)
    df['Sens'].replace("\n", "-", inplace=True,regex=True)
    list_.append(df)

    print "fichier lu:",file_

frame = pd.concat(list_)

print frame

【问题讨论】:

  • 你能在使用 Python 之前将所有文件连接在一起吗?这样只有一个文件被读取?另一种方法是将zip 文件放在一起,这将为您提供随机访问,但具有操作系统文件缓存的好处。
  • 在接触 Python 之前,我真的不明白如何连接。要将所有文件制作成一个 csv 文件?而对于zip,在哪一步?
  • 是的,制作一个大的 CSV 文件或制作一个 zip 文件。这些与 Python 无关;您必须在 Python 外部执行此操作。一旦你有了一个包含所有数据的文件,然后让你的 Python 脚本直接读取该文件。
  • 这听起来像是一个解决方案。但是如何自动做到这一点?以及如何制作zip 文件?我还是更喜欢在 python 里面做,因为我不知道到底要读多少个文件。

标签: python csv pandas encoding dataframe


【解决方案1】:

您可以尝试以下方法 - 只阅读那些真正需要的列,使用列表理解并调用一次 pd.concat([ ... ], ignore_index=True),因为它非常慢:

# there is no sense to read columns that you don't need
# specify the column list (EXCLUDING: 'aPaye','MethodePaiement','ArgentPercu')
cols = ['col1', 'col2', 'etc.']
date_cols = ['HeurePrevue','HeureDebutTrajet','HeureArriveeSurSite','HeureEffective']

df = pd.concat(
        [pd.read_csv(f, sep = ';', dayfirst = True, usecols=cols, 
                     parse_dates=date_cols)
         for f in allFiles
        ],
        ignore_index=True
     )

如果您有足够的内存来存储 两个 生成的 DF,这应该可以工作......

【讨论】:

  • 它适用于date_cols,但是当涉及usecols时,它会返回一个错误:ValueError: Usecols do not match names。如果我使用列数,它会给出反馈:IndexError: list index out of range
  • 好吧,你必须在cols 列表中指定你需要的列名——我认为错误消息ValueError: Usecols do not match names 是不言自明的......
猜你喜欢
  • 2015-12-05
  • 2013-03-31
  • 1970-01-01
  • 2021-01-22
  • 2019-04-27
  • 1970-01-01
  • 2020-12-29
  • 1970-01-01
  • 2022-01-03
相关资源
最近更新 更多