如何加快将数据帧导入熊猫

Posted

技术标签:

【中文标题】如何加快将数据帧导入熊猫【英文标题】:How to speed up importing dataframes into pandas 【发布时间】:2018-04-28 21:19:40 【问题描述】:

我知道 pandas 导入 csv 文件相对较慢的原因之一是它需要在猜测类型之前扫描列的全部内容(请参阅关于 @987654323 的大部分已弃用的 low_memory 选项的讨论@)。我的理解正确吗?

如果是,那么存储数据帧的好格式是什么,并且明确指定数据类型,因此 pandas 不必猜测(SQL 目前不是一个选项)?

those listed here 的任何选项?

我的数据框有浮点数、整数、日期、字符串和 Y/N,所以只支持数值的格式是行不通的。

【问题讨论】:

【参考方案1】:

一种选择是使用numpy.genfromtxt 使用delimiter=',', names=True,然后使用 numpy 数组初始化 pandas 数据帧。 numpy 数组将被结构化,pandas 构造函数应自动设置字段名称。

根据我的经验,这表现良好。

【讨论】:

即使对于非数字列(字符串、日期、Y/N)? 我只使用数字数据 (float64),所以我不能确定,但​​我仍然希望它以任何方式直接导入 pandas。【参考方案2】:

您可以通过在调用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)

在主要由整数列组成的大型样本数据集上,这比在对我的 pd.read_csv 的调用中指定 dtype='object' 快​​约 20%。

【讨论】:

【参考方案3】:

我会考虑 HDF5 格式或 Feather 格式。它们都非常快(Feather 可能更快,但 HDF5 功能更丰富 - 例如按索引从磁盘读取)并且它们都存储列的类型,因此它们不必猜测 dtypes 并且它们加载数据时不必转换数据类型(例如字符串到数字或字符串到日期时间)。

以下是一些速度比较:

which is faster for load: pickle or hdf5 in python

What is the fastest way to upload a big csv file in notebook to work with python pandas?

【讨论】:

以上是关于如何加快将数据帧导入熊猫的主要内容,如果未能解决你的问题,请参考以下文章

如何根据字节大小拆分熊猫数据帧

如何将每一行熊猫数据帧附加到另一个数据帧的每一行

如何加快熊猫数据框迭代

循环遍历层后附加熊猫数据帧

熊猫如何按间隔按列拆分数据帧

熊猫如何按间隔按列拆分数据帧