首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Pandas read_csv low_memory和dtype选项

Pandas read_csv low_memory和dtype选项
EN

Stack Overflow用户
提问于 2014-06-17 03:56:48
回答 11查看 467.5K关注 0票数 442

当调用

代码语言:javascript
复制
df = pd.read_csv('somefile.csv')

我得到了:

/Users/josh/anaconda/envs/py27/lib/python2.7/site-packages/pandas/io/parsers.py:1130:

DtypeWarning:列(4,5,7,16)具有混合类型。在导入时指定dtype选项或设置low_memory=False。

为什么dtype选项与low_memory相关,为什么让它成为False可以帮助解决这个问题?

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2014-12-02 00:04:11

不推荐使用的low_memory选项

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

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

Dtype猜测(非常糟糕)

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

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

指定数据类型(应该总是这样做)

添加

代码语言:javascript
复制
dtype={'user_id': int}

pd.read_csv()的调用将使pandas知道当它开始读取文件时,这只是整数。

同样值得注意的是,如果文件中的最后一行在user_id列中写入了"foobar",那么如果指定了上面的dtype,加载将会崩溃。

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

代码语言:javascript
复制
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、timedelta64ns和datetime64ns。请注意,numpy日期/时间数据类型不支持时区。

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

'datetime64[ns, <tz>]',它是时区感知的时间戳。

‘'category’,本质上是一个枚举(要保存的由整型键表示的字符串

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

“sparse”,“Sparseint”,“Sparsefloat”用于稀疏数据或“有很多漏洞的数据”,而不是在数据帧中保存NaN或无,它省略了对象,节省了空间。

“‘Interval”是一个独立的主题,但它的主要用途是索引。See more here

“Int8”、“Int16”、“Int32”、“Int64”、“UInt8”、“UInt16”、“UInt32”、“UInt64”都是可为空的特定于熊猫的整数,这与numpy变量不同。

“string”是用于处理字符串数据的特定数据类型,它允许访问序列上的.str属性。

‘'boolean’类似于numpy 'bool‘,但它也支持缺失数据。

请在此处阅读完整的参考:

Pandas dtype reference

注意事项,注意事项,注意事项

设置dtype=object将使上述警告静默,但不会提高内存效率,如果有什么不同的话,只会提高进程效率。

设置dtype=unicode不会做任何事情,因为对numpy来说,unicode表示为object

转换器的使用

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

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

票数 595
EN

Stack Overflow用户

发布于 2014-06-17 04:11:56

尝试:

代码语言:javascript
复制
dashboard_df = pd.read_csv(p_file, sep=',', error_bad_lines=False, index_col=False, dtype='unicode')

根据pandas的文档:

dtype :列->类型的类型名称或字典

至于low_memory,它是真正的by default,目前还没有文档。但我不认为这是相关的。该错误消息是通用的,所以您无论如何都不需要使用low_memory。希望这对你有所帮助,如果你有更多的问题,请告诉我

票数 70
EN

Stack Overflow用户

发布于 2015-10-16 11:12:36

代码语言:javascript
复制
df = pd.read_csv('somefile.csv', low_memory=False)

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

票数 54
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24251219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档