当前位置: 首页 > 知识库问答 >
问题:

Pandas读取\u csv低\u内存和数据类型选项

丁子石
2023-03-14

打电话的时候

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

我得到:

/Users/josh/anaconda/envs/py27/lib/python2。7/站点包/熊猫/io/解析器。py:1130:DtypeWarning:列(4,5,7,16)具有混合类型。在导入时指定dtype选项或将低内存设置为False。

为什么dtype选项与low_memory相关,为什么将其设为False有助于解决此问题?

共有3个答案

柴嘉石
2023-03-14
df = pd.read_csv('somefile.csv', low_memory=False)

这应该可以解决问题。当从CSV读取180万行时,我得到了完全相同的错误。

广宏远
2023-03-14

尝试:

dashboard_df = pd.read_csv(p_file, sep=',', error_bad_lines=False, index_col=False, dtype='unicode')

根据文件:

dtype:输入列的名称或判决-

至于low_memory,默认情况下为True,尚未记录。不过,我不认为这有什么关系。错误消息是通用的,所以无论如何都不需要弄乱low_memory。希望这有助于让我知道如果你有进一步的问题

欧镜
2023-03-14

low_memory选项没有被正确地弃用,但它应该被弃用,因为它实际上没有做任何不同的事情[源]

出现此low_memory警告的原因是,猜测每列的数据类型非常需要内存。Pandas试图通过分析每列中的数据来确定要设置的数据类型。

熊猫只能在读取整个文件后确定列应该具有什么dtype。这意味着在读取整个文件之前不能真正解析任何内容,除非在读取最后一个值时必须更改该列的dtype。

考虑一个文件的例子,该文件有一个名为UsSeriID的列,它包含1000万个用户用户名总是数字的行。由于pandas无法知道它只是数字,所以它可能会将其作为原始字符串保留,直到它读取了整个文件。

添加

dtype={'user_id': int}

pd。read_csv()调用将使Panda在开始读取文件时知道这只是整数。

同样值得注意的是,如果文件中的最后一行将在user_id列中写入"fobar",则如果指定上述dtype,加载将崩溃。

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

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

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

'datetime64[ns,

类别,本质上是一个枚举(由保存的整数键表示的字符串

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

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

间隔本身是一个主题,但它的主要用途是索引。在这里看到更多

'Int8'、'Int16'、'Int32'、'Int64'、'UInt8'、'UInt16'、'UInt32'、'UInt64'都是熊猫特定的整数,这些整数可以为空,不同于Numpy变体。

String是一个特定的dtype,用于处理字符串数据,并提供对序列上的. str属性的访问权限。

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

请阅读此处的完整参考资料:

数据类型参考

设置dtype=ject将使上述警告保持沉默,但不会提高内存效率,只有进程效率。

设置dtype=unicode不会起任何作用,因为对于numpy,unicode表示为object

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

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

 类似资料:
  • 读取文件已支持 windows 系统,版本号大于等于 1.3.4.1; 扩展版本大于等于 1.2.7; PECL 安装时将会提示是否开启读取功能,请键入 yes; 编译 编译时需添加 --enable-reader ./configure --enable-reader 类型数组说明 文档第三列是时间,你需要这样设置类型: [ 2 => \Vtiful\Kernel\Excel::TYP

  • 问题内容: 当我写这篇文章时,我尝试使用Pandas处理大型CSV文件。 它会引发“ pandas.parser.CParserError:错误标记数据。C错误:内存不足” wc -l表示有13822117行,我需要在此csv文件数据帧上进行汇总,有没有办法处理其他然后拆分CSV成几个文件,并编写代码以合并结果?有什么建议吗?谢谢 输入是这样的: 所需的输出是这样的: 如果数据集较小,则可以使用下

  • 本文向大家介绍Java内存结构和数据类型,包括了Java内存结构和数据类型的使用技巧和注意事项,需要的朋友参考一下 Java内存结构   内存就是暂时对数据的一个存储,他的存储速度非常的快,但是他是暂时的存储,从开机时开始存储,掉电或关机之后数据全部丢失。内存的生命周期就是开机和关机,开机的时候开始计算,关机什么都没有了。优点存储速度快,缺点容易坏掉,如果开机的时候,一点反映都没有,屏幕不亮键盘鼠

  • 问题内容: 我想将稀疏矩阵(156060x11780)转换为数据帧,但出现内存错误,这是我的代码 我有一个问题 。我该如何解决? 问题答案: 尝试这个: 更新: 对于Pandas 0.20+,我们可以直接从稀疏数组构造:

  • 问题内容: 我正在使用该功能将Excel文件导入到熊猫数据框。 列之一是表的主键:它是所有数字,但是存储为文本(Excel单元格左上角的绿色小三角形确认了这一点)。 但是,当我将文件导入pandas数据框时,该列将以浮点形式导入。这意味着,例如“ 0614”变为614。 导入列时是否可以指定数据类型?我知道在导入CSV文件时这是可能的,但找不到的语法。 我能想到的唯一解决方案是在Excel中的文本

  • 我使用以下代码通过指定每个列的类型来读取csv: 但它有一个错误: 不知道如何跳过NA?