【问题标题】: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,所以只支持数值的格式是行不通的。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案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 并且它们加载数据时不必转换数据类型(例如字符串到数字或字符串到日期时间)。

      以下是一些速度比较:

      【讨论】:

        猜你喜欢
        • 2020-12-01
        • 1970-01-01
        • 2014-01-04
        • 2020-03-24
        • 2021-05-08
        • 2021-09-17
        • 1970-01-01
        • 2022-01-11
        • 2021-06-24
        相关资源
        最近更新 更多