有没有办法加快 python 中处理大型 CSV 和数据帧的速度?

2024-03-17

我正在处理一些大小在 1Gb 到 2Gb 范围内的 CSV 文件。仅将文件加载到 pandas 数据帧中就需要 20-30 分钟,而我执行的每个操作则需要 20-30 分钟,例如按列名称过滤数据帧,打印 dataframe.head() 等。有时,当我在等待时尝试使用另一个应用程序时,它也会滞后于我的计算机。我使用的是 2019 年款 Macbook Pro,但我想其他设备也是如此。

我尝试过使用modin,但数据操作仍然很慢。

有什么办法可以让我工作更有效率吗?

预先感谢您的回复。


pandas 文档上扩展到大型数据集 https://pandas.pydata.org/pandas-docs/stable/user_guide/scale.html有一些很棒的技巧,我将在这里总结一下:

  1. 加载更少的数据 https://pandas.pydata.org/pandas-docs/stable/user_guide/scale.html#load-less-data。使用以下命令读入列或行的子集usecols or nrows 参数为pd.read_csv https://pandas.pydata.org/docs/reference/api/pandas.read_csv.html。例如,如果您的数据有很多列,但您只需要col1 and col2列,使用pd.read_csv(filepath, usecols=['col1', 'col2'])。如果您要加载带有大量额外逗号的数据集(例如,行看起来像index,col1,col2,,,,,,,,,,,。在这种情况下,使用nrows仅读入数据的子集,以确保结果仅包含您需要的列。
  2. 使用高效的数据类型 https://pandas.pydata.org/pandas-docs/stable/user_guide/scale.html#use-efficient-datatypes。默认情况下,pandas 将所有整数数据存储为有符号 64 位整数,将浮点数存储为 64 位浮点数,将字符串存储为对象或字符串类型(取决于版本)。您可以使用以下工具将它们转换为较小的数据类型Series.astype https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.astype.html or pd.to_numeric https://pandas.pydata.org/docs/reference/api/pandas.to_numeric.htmldowncast option.
  3. 使用分块 https://pandas.pydata.org/pandas-docs/stable/user_guide/scale.html#use-chunking。解析大数据块可能会很慢,特别是如果您的计划是按行操作然后将其写出或将数据缩减为较小的最终形式。或者,使用low_memory标志让 Pandas 在后端使用分块迭代器,但返回单个数据帧。
  4. 使用其他库 https://pandas.pydata.org/pandas-docs/stable/user_guide/scale.html#use-other-libraries。这里列出了几个很棒的库,但我要特别指出dask.dataframe https://docs.dask.org/en/latest/dataframe.html,它专门针对您的用例,通过启用镜像的 CSV 文件的分块、多核处理熊猫 API https://docs.dask.org/en/latest/dataframe.html#dask-dataframe-copies-the-pandas-api并有简单的方法在处理数据后将数据转换回正常的 pandas 数据帧(如果需要)。

此外,我认为您应该考虑一些特定于 csv 的事情:

  1. 指定列数据类型 https://pandas.pydata.org/pandas-docs/stable/user_guide/io.html#specifying-column-data-types。特别是在分块的情况下,但即使您没有,指定列类型也可以显着减少读取时间和内存使用量,并突出显示数据中的问题区域(例如,NaN 指示器或不满足 pandas 默认值之一的标志)。使用dtypes具有单个数据类型的参数应用于所有列或列名的字典,数据类型对指示要读入的类型。或者,您可以提供converters格式化日期、时间或其他数字数据(如果它不是 pandas 识别的格式)。
  2. 指定解析器引擎 https://pandas.pydata.org/pandas-docs/stable/user_guide/io.html#specifying-the-parser-engine- pandas 可以用纯 python(慢)或 C(快得多)读取 csv。 python 引擎的功能稍微多一些(例如,目前 C 引擎无法读取具有复杂的多字符分隔符的文件,并且无法跳过页脚)。尝试使用参数engine='c'以确保正在使用 C 引擎。如果您需要一种不受支持的文件类型,我会尝试首先手动修复文件(例如删除页脚),然后使用 C 引擎进行解析(如果可能)。
  3. 确保捕获数字列中的所有 NaN 和数据标志。这可能是一项艰巨的任务,在输入中指定特定的数据类型有助于捕获不良情况。使用na_values, keep_default_na, date_parser, and converters论点pd.read_csv https://pandas.pydata.org/docs/reference/api/pandas.read_csv.html。目前,解释为 NaN 的默认值列表是['', '#N/A', '#N/A N/A', '#NA', '-1.#IND', '-1.#QNAN', '-NaN', '-nan', '1.#IND', '1.#QNAN', '<NA>', 'N/A', 'NA', 'NULL', 'NaN', 'n/a', 'nan', 'null']例如,如果您的数字列具有编码为的非数字值notANumber那么这将被错过,并且要么导致错误(如果指定了数据类型),要么导致 pandas 将整个列重新分类为对象列(对内存和速度来说超级糟糕!)。
  4. 阅读pd.read_csv https://pandas.pydata.org/docs/reference/api/pandas.read_csv.html一遍又一遍地文档。read_csv 的许多参数都有重要的性能考虑。pd.read_csv经过优化以平滑可被视为 csv 的大量变化,并且更多的 magic pandas 必须准备好执行(确定类型、解释 nan、转换日期(可能)、跳过页眉/页脚、推断索引/列、处理坏行等)读取速度越慢。给它尽可能多的提示/约束,你可能会发现性能大幅提高!如果这还不够,其中许多调整也将适用于dask.dataframe https://docs.dask.org/en/latest/dataframe.htmlAPI,因此可以很好地进一步扩展。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有办法加快 python 中处理大型 CSV 和数据帧的速度? 的相关文章

随机推荐

  • 设计..首次登录后应要求更改密码

    我在我的应用程序中使用设备作为身份验证 我需要在设备中实现功能 首次登录后 用户应要求更改密码 我尝试通过模型 after create update pass change def update pass change self pass
  • 如何强制 Eclipse 请求默认工作空间?

    我注意到安装 cdt 后 Eclipse 总是加载默认工作区 中列出的工作区config ini in osgi instance area default 无论是否打开 Eclipse 都不会询问要打开哪个工作区Prompt for wo
  • 以随机顺序打印数组[重复]

    这个问题在这里已经有答案了 如何在java中以随机顺序打印数组 例子 int myArray 5 4 3 2 1 打印时 结果可能是 3 2 1 4 5 or 4 3 2 5 1 你应该看看写一个费舍尔 耶茨洗牌 http en wikip
  • 不支持的授权类型 Salesforce OAUTH2

    我正在使用 VBA 在 Salesforce 中获得授权 然后最终想要运行 Salesforce 报告并将结果转储到 Excel 中 我已编写以下内容来处理授权 但收到 unsupported grant type 错误 到目前为止我的代码
  • 批处理文件执行文件夹中的所有.exe

    我需要创建一个批处理脚本来运行文件夹中的所有 exe 文件 这必须包括子文件夹 我运行的是Windows 7 批处理文件存储在根文件夹中 我尝试了几种变体但没有成功 两个主要变化如下 REM dir exe S B gt tmpFile R
  • 安卓中的adb是什么?

    当我尝试运行 Android 程序时 出现以下错误 请解释一下到底是什么adb是的 如何重新启动呢 我收到以下错误 The connection to adb is down and a severe error has occured Y
  • 为什么 Android 上的 onCallStateChanged() 在一次调用中会被多次调用?

    我想实现一个像防火墙一样阻止呼叫的应用程序 当我调试我的应用程序时 我发现当有电话进来时 onCallStateChanged 界面中的函数电话状态监听器被调用 3 次 因此 阻止一个调用可能会导致三个日志 我很困惑 my code Ove
  • PLSQL 触发器通过 SQL 加载器触发

    当我们通过 SQL 加载器插入时 表会被触发吗 请详细解释一下 Oracle 将执行INSERT如果使用常规负载则触发 但是当你使用直接负载时不是 http docs oracle com cd E11882 01 server 112 e
  • 确定 django 中的属性是否为“DeferredAttribute”

    上下文 我在 Django Cache Machine 中发现了一个相当严重的错误 导致其失效逻辑在从 Django 1 4 升级到 1 7 后失去理智 该错误仅限于调用only 在扩展缓存机器的模型上CachingMixin 它会导致深度
  • 如何剪切csv的列

    我有一组 csv 文件 大约 250 个 每个文件有 300 到 500 条记录 我需要从每个文件中剪切 2 或 3 列并将其存储到另一个文件中 我在用着操作系统 有什么办法可以在命令或实用程序中做到这一点吗 如果您知道字段内没有出现列分隔
  • 使用 1xx 响应通过 HTTP 报告进度

    问题 通过 HTTP 提供进度信息 我正在编写一个应用程序 我想为长时间运行的请求提供进度信息 我希望客户端能够报告进度 例如完成百分比 并向用户发送消息 HTTP 1xx 响应 我的目的是在最终 HTTP 响应之前使用 HTTP 1xx
  • 如何在 Gnome 终端中对 Python 错误的输出进行着色?

    注意 我在研究如何实际做到这一点后提出这个问题 其他有点相似但实际上与我的问题不同的问题涉及 颜色编码withinpython脚本 导入颜色库within剧本 使用类似的工具Solarized改进工具 例如Vim对 python 代码进行颜
  • Python unittest:如何临时将标准输出消息重定向到缓冲区并测试其内容?

    我想捕获发送到的消息stdout our stderr 在测试期间暂时断言这些消息中是否出现某些字符串模式 import unittest class SomeTest unittest TestCase def test stdout s
  • Tomcat 6 堆大小 - 这是正确的吗?

    我在 Red Hat 机器上运行多个 tomcat 我想为每个 tomcat 配置单独的堆大小 某些实例使用更多内存 我可以在 catalina sh 文件中输入以下内容来设置堆大小最小 最大 bt CATALINA OPTS Xms64m
  • WPF 将控件可见性绑定到另一个控件的聚焦属性

    我有一个显示项目列表的组合框 我想在它旁边放置一个按钮来触发命令以查看所选项目的详细信息 到目前为止 一切都很好 现在我希望该按钮仅在组合框具有焦点时才可见 或处于 编辑 模式 但不仅在弹出窗口打开时 我想我可以将按钮的可见性绑定到组合框的
  • 命令“git checkout”的含义。 [复制]

    这个问题在这里已经有答案了 虽然我知道标题中的命令类似于撤消对当前存储库的更改 但我无法理解它的实际工作原理或如何读取该命令 任何线索都会有很大的帮助 git 结账
  • Python 中的参数解析(必需与可选)

    我目前正在编写一个能够采用多个标志的脚本 我希望它无论最后一个参数是什么都应该是 start stop status usr bin env python from argparse import ArgumentParser def ar
  • Oracle 11g - FOR 循环仅将工作日插入表中?

    我想将一些数据插入与明年日期相关的表中 实际上我只需要插入工作日 BEGIN FOR i IN 1 365 LOOP INSERT INTO MY TABLE ID MY DATE VALUES i to date sysdate DD M
  • 如何以Python方式获取numpy argwhere函数的最大值

    我想使用 numpy argwhere 来查找数据中的最大值在哪里 下面是一个示例集 描述了我正在做的事情 bins np arange 10 data np array 6 4 8 5 np argwhere bins
  • 有没有办法加快 python 中处理大型 CSV 和数据帧的速度?

    我正在处理一些大小在 1Gb 到 2Gb 范围内的 CSV 文件 仅将文件加载到 pandas 数据帧中就需要 20 30 分钟 而我执行的每个操作则需要 20 30 分钟 例如按列名称过滤数据帧 打印 dataframe head 等 有