Pandas read_csv:low_memory 和 dtype 选项

2024-02-28

df = pd.read_csv('somefile.csv')

...给出错误:

.../site-packages/pandas/io/parsers.py:1130: DtypeWarning:列 (4,5,7,16) 具有混合类型。指定数据类型 导入时的选项或设置 low_memory=False。

为什么是dtype相关选项low_memory,以及为什么可能low_memory=False help?


已弃用的 low_memory 选项

The low_memory选项没有被正确弃用,但它应该被弃用,因为它实际上并没有做任何不同的事情[source https://github.com/pydata/pandas/issues/5888]

你得到这个的原因low_memory警告是因为猜测每列的数据类型非常需要内存。 Pandas 尝试通过分析每列中的数据来确定要设置的数据类型。

Dtype 猜测(非常糟糕)

Pandas 仅在读取整个文件后才能确定列应具有的数据类型。这意味着在读取整个文件之前无法真正解析任何内容,除非您在读取最后一个值时冒着必须更改该列的 dtype 的风险。

考虑一个文件的示例,该文件具有名为 user_id 的列。 它包含 1000 万行,其中 user_id 始终为数字。 由于 pandas 无法知道它只是数字,因此它可能会将其保留为原始字符串,直到读取整个文件。

指定数据类型(应该始终这样做)

adding

dtype={'user_id': int}

to the pd.read_csv() http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html调用将使 pandas 知道它何时开始读取文件,这只是整数。

另外值得注意的是,如果文件中的最后一行有"foobar"写在user_id列,如果指定了上述数据类型,加载将会崩溃。

定义数据类型时损坏的数据示例

import pandas as pd
try:
    from StringIO import StringIO
except ImportError:
    from io import StringIO


csvdata = """user_id,username
1,Alice
3,Bob
foobar,Caesar"""
sio = StringIO(csvdata)
pd.read_csv(sio, dtype={"user_id": int, "username": "string"})

ValueError: invalid literal for long() with base 10: 'foobar'

数据类型通常是一个令人费解的东西,请在此处阅读有关它们的更多信息:http://docs.scipy.org/doc/numpy/reference/ generated/numpy.dtype.html http://docs.scipy.org/doc/numpy/reference/generated/numpy.dtype.html

存在哪些数据类型?

我们可以访问 numpy 数据类型:float、int、bool、timedelta64[ns] 和 datetime64[ns]。请注意,numpy 日期/时间 dtypes 是not时区意识。

Pandas 用自己的数据类型扩展了这组数据类型:

'datetime64[ns, <tz>]'这是一个时区感知时间戳。

'category' 本质上是一个枚举(由整数键表示的字符串以保存

'period[]' 不要与 timedelta 混淆,这些对象实际上锚定到特定的时间段

'Sparse'、'Sparse[int]'、'Sparse[float]' 用于稀疏数据或“其中有很多空洞的数据”,它不是在数据框中保存 NaN 或 None,而是省略对象,从而节省空间。

“间隔”是它自己的一个主题,但它的主要用途是用于索引。在这里查看更多内容 https://pandas.pydata.org/pandas-docs/stable/user_guide/advanced.html#advanced-intervalindex

'Int8'、'Int16'、'Int32'、'Int64'、'UInt8'、'UInt16'、'UInt32'、'UInt64' 都是 pandas 特定的可为空的整数,与 numpy 变体不同。

'string' 是一种用于处理字符串数据的特定数据类型,并提供对.str系列上的属性。

“boolean”类似于 numpy 的“bool”,但它也支持缺失数据。

在这里阅读完整的参考:

Pandas 数据类型参考 https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.dtypes.html

陷阱、警告、注释

Setting dtype=object将使上述警告静音,但不会提高内存效率,只会提高处理效率(如果有的话)。

Setting dtype=unicode不会做任何事情,因为对于 numpy,aunicode表示为object.

转换器的使用

@sparrow正确地指出了转换器的用法,以避免熊猫遇到时爆炸'foobar'在指定为的列中int。我想补充一点,在 pandas 中使用转换器确实很重且效率低下,应该作为最后的手段使用。这是因为 read_csv 进程是单个进程。

CSV 文件可以逐行处理,因此可以通过简单地将文件切成段并运行多个进程来更有效地由多个转换器并行处理,这是 pandas 不支持的。但这是一个不同的故事。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Pandas read_csv:low_memory 和 dtype 选项 的相关文章

  • 更新 Sqlalchemy 中的多个列

    我有一个在 Flask 上运行的应用程序 并使用 sqlalchemy 与数据库交互 我想用用户指定的值更新表的列 我正在使用的查询是 def update table value1 value2 value3 query update T
  • 更改 Altair 中的构面标题位置?

    如何将方面标题 在本例中为年份 移动到每个图的上方 默认值似乎位于图表的一侧 这可以轻易改变吗 import altair as alt from vega datasets import data df data seattle weat
  • numpy 使用 datetime64 进行数字化

    我似乎无法让 numpy digitize 与 datetime64 一起使用 date bins np array np datetime64 datetime datetime 2014 n 1 s for n in range 1 1
  • 可以用 Django 制作移动应用程序吗?

    我想知道我是否可以在我的网站上使用 Django 代码 并以某种方式在移动应用程序 Flutter 等框架中使用它 那么是否可以使用我现在拥有的 Django 后端并在移动应用程序中使用它 所以就像models views etc 是的 有
  • 更改 python tkinter canvas 中的线坐标

    我画了一条线tkinter Canvas现在我想移动一端 这可能吗 例如和itemconfig import tkinter tk tkinter Tk canvas tkinter Canvas tk canvas pack line c
  • Python Pandas 根据另一列的总计从另一个数据帧中选择值

    我下面有一个 DataFrame 但我需要根据取消和订单列从每个代码中选择行 假设代码 xxx 的阶数为 6 1 5 1 阶数为 11 我需要一种算法 可以选择满足总共 11 行的行 阶数为 6 5 如果没有行匹配 则选择最接近的 id 并
  • python是带有字符串的运算符行为[重复]

    这个问题在这里已经有答案了 我无法理解以下行为 我正在创建 2 个字符串 并使用 is 运算符来比较它 对于第一种情况 它的工作方式有所不同 对于第二种情况 它按预期工作 当我使用逗号或空格时 它显示是什么原因False与比较is当没有使用
  • python 中的 Johansen 协整检验

    我找不到任何有关在处理统计和时间序列分析 pandas 和 statsmodel 的 Python 模块中执行 Johansen 协整检验的功能的参考 有谁知道是否有一些代码可以执行时间序列之间的协整测试 现在 这已在 Python 的 s
  • Apache Spark 中的高效字符串匹配

    我使用 OCR 工具从屏幕截图中提取文本 每个大约 1 5 句话 然而 当手动验证提取的文本时 我注意到时不时会出现一些错误 鉴于文本 你好 我真的很喜欢 Spark 我注意到 1 像 I 和 l 这样的字母被 替换 2 表情符号未被正确提
  • PySide6.1 与 matplotlib 3.4 不兼容

    当我只安装PySide6时 GUI程序运行良好 但是一旦我安装了matplotlib及其依赖包 包括pyqt5 则GUI程序将无法运行并输出以下错误消息 This application failed to start because no
  • django-admin.py makemessages 不起作用

    我正在尝试翻译一个字符串 load i18n trans Well Hello there how are you to Hola amigo que tal 我的 settings py 文件有这样的内容 LOCALE PATHS os
  • 将文本注释到轴并对齐为圆

    我正在尝试在轴上绘制文本并将该文本与圆对齐 更准确地说 有一些具有不同坐标 x y 的点位于该圆内 并使用以下命令创建 ax scatter x y s 100 我想用圆圈连接并标记每个点 Cnameb 文本的坐标由 xp yp 定义 因此
  • 由于 json 字符串化 dict 键导致数据丢失

    考虑下面的例子 gt gt gt import json gt gt gt d 0 potato 0 spud gt gt gt json dumps d 0 potato 0 spud gt gt gt json loads json d
  • 解析根元素内元素之间的 XML 文本

    我正在尝试用 Python 解析 XML 以下是 XML 结构的示例 a aaaa1 b bbbb b aaaa2 a
  • Python 声音(“铃声”)

    我想让一个 python 程序在完成任务时通过发出嘟嘟声来提醒我 目前 我使用import os然后使用命令行语音程序说 进程完成 我更愿意它是一个简单的 铃 我知道有一个函数可以用于Cocoa apps NSBeep 但我认为这与此没有太
  • 解析 XML 标签不匹配时出错

  • 如何使用 Keras ImageDataGenerator 预测单个图像?

    我已经训练 CNN 对图像进行 3 类分类 在训练模型时 我使用 keras 的 ImageDataGenerator 类对图像应用预处理功能并重新缩放它 现在我的网络在测试集上训练得非常准确 但我不知道如何在单图像预测上应用预处理功能 如
  • 如何使用 matplotlib 为圆柱体的每个单独面添加颜色

    我正在尝试为圆柱体的每个面着色 但是我不确定如何进行 我尝试了以下方法 for i in range 10 col append for i in range 10 for j in range 20 col i append plt cm
  • Python:高精度time.sleep

    你能告诉我如何在 Win32 和 Linux 上的 Python 2 6 中获得高精度睡眠函数吗 您可以在中使用浮点数sleep http docs python org library time html time sleep 该参数可以
  • 使用 urllib 编码时保持 url 参数有序

    我正在尝试用 python 模拟 get 请求 我有一个参数字典 并使用 urllib urlencode 对它们进行 urlencode 我注意到虽然字典的形式是 k1 v1 k2 v2 k3 v3 urlencoding 后参数的顺序切

随机推荐