不推荐使用的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 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'
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 [int]”,“ Sparse [float]”用于稀疏数据或“其中有很多漏洞的数据”,而不是在数据框中保存NaN或None,它忽略了对象,从而节省了空间。
“间隔”本身是一个主题,但其主要用途是用于索引。在这里查看更多
与numpy变体不同,“ Int8”,“ Int16”,“ Int32”,“ Int64”,“ UInt8”,“ UInt16”,“ UInt32”,“ UInt64”都是可为空的熊猫特定整数。
'string'是用于处理字符串数据的特定dtype,可访问.str
系列中的属性。
'boolean'类似于numpy'bool',但它也支持丢失数据。
在此处阅读完整的参考:
熊猫DType参考
陷阱,注意事项,笔记
设置dtype=object
将使上面的警告静音,但不会使其更有效地使用内存,仅在有任何处理时才有效。
设置dtype=unicode
不会做任何事情,因为对于numpy,a unicode
表示为object
。
转换器的使用
@sparrow正确指出了转换器的用法,以避免在遇到'foobar'
指定为的列时遇到大熊猫int
。我想补充一点,转换器在熊猫中使用时确实很笨重且效率低下,应该作为最后的手段使用。这是因为read_csv进程是单个进程。
CSV文件可以逐行处理,因此可以通过简单地将文件切成段并运行多个进程来由多个转换器并行更有效地进行处理,而这是熊猫所不支持的。但这是一个不同的故事。