不推荐使用的low_memory选项
该
low_memory选项未正确弃用,但应该正确使用,因为它实际上没有做任何不同的事情[来源]
收到此
low_memory警告的原因是因为猜测每列的dtypes非常需要内存。熊猫尝试通过分析每一列中的数据来确定要设置的dtype。
Dtype猜测(非常糟糕)
一旦读取了整个文件,熊猫便只能确定列应具有的dtype。这意味着在读取整个文件之前,无法进行任何真正的解析,除非您冒着在读取最后一个值时不得不更改该列的dtype的风险。
考虑一个文件的示例,该文件具有名为user_id的列。它包含1000万行,其中user_id始终是数字。由于熊猫不能只知道数字,因此它可能会一直保留为原始字符串,直到它读取了整个文件。
指定dtypes(应该总是这样做)
加
dtype={'user_id': int}该
pd.read_csv()呼叫将使大熊猫知道它开始读取文件时,认为这是唯一的整数。
还值得注意的是,如果文件的最后一行将被
"foobar"写入
user_id列中,那么如果指定了上述dtype,则加载将崩溃。
定义dtypes时会中断的中断数据示例
import pandas as pdtry: from StringIO import StringIOexcept importError: from io import StringIOcsvdata = """user_id,username1,Alice3,Bobfoobar,Caesar"""sio = StringIO(csvdata)pd.read_csv(sio, dtype={"user_id": int, "username": "string"})ValueError: invalid literal for long() with base 10: 'foobar'dtypes通常是一个numpy的东西,请在这里阅读有关它们的更多信息:http
://docs.scipy.org/doc/numpy/reference/generated/numpy.dtype.html
存在哪些dtype?
我们可以访问numpy dtypes:float,int,bool,timedelta64 [ns]和datetime64
[ns]。请注意,numpy日期/时间dtypes 不 识别时区。
熊猫通过自己的方式扩展了这套dtypes:
‘datetime64 [ns,]’这是一个时区感知的时间戳。
‘category’本质上是一个枚举(以整数键表示的字符串以保存
‘period []’不要与timedelta混淆,这些对象实际上是固定在特定时间段的
“ Sparse”,“ Sparse [int]”,“ Sparse
[float]”用于稀疏数据或“其中有很多孔的数据”,而不是在数据框中保存NaN或None,它忽略了对象,从而节省了空间。
“间隔”本身是一个主题,但其主要用途是用于索引。在这里查看更多
与numpy变体不同,“ Int8”,“ Int16”,“ Int32”,“ Int64”,“ UInt8”,“ UInt16”,“ UInt32”,“
UInt64”都是可为空的熊猫特定整数。
‘string’是用于处理字符串数据的特定dtype,可访问
.str系列中的属性。
‘boolean’类似于numpy’bool’,但它也支持丢失数据。
在此处阅读完整的参考:
熊猫DType参考
陷阱,注意事项,笔记
设置
dtype=object将使上面的警告静音,但不会使它的内存使用效率更高,仅在处理任何事情时才有效。
设置
dtype=unipre不会做任何事情,因为对于numpy,a
unipre表示为
object。
转换器的用法
@sparrow正确指出了转换器的用法,以避免在遇到
'foobar'指定为的列时遇到大熊猫
int。我想补充一点,转换器在熊猫中使用时确实很笨重且效率低下,应该作为最后的手段使用。这是因为read_csv进程是单个进程。
CSV文件可以逐行处理,因此可以通过简单地将文件切成段并运行多个进程来由多个转换器并行更有效地进行处理,而这是pandas所不支持的。但这是一个不同的故事。



