当调用
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
可以帮助解决这个问题?
发布于 2014-12-02 00:04:11
不推荐使用的low_memory选项
low_memory
选项没有被正确弃用,但它应该被弃用,因为它实际上没有做任何不同的事情[source]
您收到此low_memory
警告的原因是,猜测每列的数据类型对内存的要求非常高。Pandas试图通过分析每列中的数据来确定要设置的数据类型。
Dtype猜测(非常糟糕)
Pandas只能在读取整个文件后确定列应该具有的数据类型。这意味着在读取整个文件之前不能真正解析任何内容,除非您冒着在读取最后一个值时必须更改该列的数据类型的风险。
考虑一个文件的示例,该文件有一个名为user_id的列。它包含1,000万行,其中user_id始终是数字。由于pandas无法知道它只是数字,因此它可能会将其保留为原始字符串,直到它读取整个文件。
指定数据类型(应该总是这样做)
添加
dtype={'user_id': int}
对pd.read_csv()
的调用将使pandas知道当它开始读取文件时,这只是整数。
同样值得注意的是,如果文件中的最后一行在user_id
列中写入了"foobar"
,那么如果指定了上面的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、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‘,但它也支持缺失数据。
请在此处阅读完整的参考:
注意事项,注意事项,注意事项
设置dtype=object
将使上述警告静默,但不会提高内存效率,如果有什么不同的话,只会提高进程效率。
设置dtype=unicode
不会做任何事情,因为对numpy来说,unicode
表示为object
。
转换器的使用
@sparrow正确地指出了转换器的使用,以避免在指定为int
的列中遇到'foobar'
时发生爆炸。我想补充的是,在熊猫中使用转换器真的很笨重,效率很低,应该作为最后的手段使用。这是因为read_csv进程是单个进程。
CSV文件可以逐行处理,因此可以通过简单地将文件分成段并运行多个进程来更有效地由多个转换器并行处理,这是pandas不支持的。但这是一个不同的故事。
发布于 2014-06-17 04:11:56
尝试:
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。希望这对你有所帮助,如果你有更多的问题,请告诉我
发布于 2015-10-16 11:12:36
df = pd.read_csv('somefile.csv', low_memory=False)
这应该可以解决这个问题。当从CSV读取180万行时,我得到了完全相同的错误。
https://stackoverflow.com/questions/24251219
复制相似问题