据我所知,pandas导入csv文件相对较慢的原因之一是它需要在猜测类型之前扫描整个列的内容(请参阅围绕最常用的low_memory
选项的讨论pandas.read_csv
)。我的理解是否正确?
如果是,那么存储数据帧的格式是什么,并且明确指定了数据类型,所以pandas不必猜测(SQL现在不是一个选项)?
特别是来自those listed here的任何选项?
我的数据帧有浮点数,整数,日期,字符串和Y / N,所以支持数值的格式不会这样做。
谢谢!
答案 0 :(得分:2)
一种选择是使用numpy.genfromtxt
使用delimiter=',', names=True
,然后使用numpy数组初始化pandas数据帧。 numpy数组将被结构化,pandas构造函数应自动设置字段名称。
根据我的经验,这表现良好。
答案 1 :(得分:1)
通过将列名称及其数据类型指定为对pandas.read_csv
的调用,可以提高从CSV文件导入的效率。如果文件中有现有的列标题,您可能不必指定名称,只能使用它们,但我想跳过标题并指定完整性的名称:
import pandas as pd
import numpy as np
col_names = ['a', 'b', 'whatever', 'your', 'names', 'are']
col_types = {k: np.int32 for k in col_names} # create the type dict
col_types['a'] = 'object' # can change whichever ones you like
df = pd.read_csv(fname,
header = None, # since we are specifying our own names
skiprows=[0], # if you *do* have a header row, skip it
names=col_names,
dtype=col_types)
在包含大部分整数列的大型样本数据集上,这比我在调用dtype='object'
时指定pd.read_csv
的速度快20%。
答案 2 :(得分:1)
我会考虑使用HDF5格式或羽毛格式。它们都非常快(羽毛可能更快,但HDF5功能更丰富 - 例如通过索引从磁盘读取)并且它们都存储列的类型,因此它们不必猜测dtypes
并且他们不必在加载数据时将数据类型(例如字符串转换为数字或字符串转换为日期时间)。
以下是一些速度比较: