问题:熊猫read_csv low_memory和dtype选项
打电话时
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设置为false。
为什么dtype
选项与关联low_memory
,为什么使它False
有助于解决此问题?
回答 0
不推荐使用的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=object
将使上面的警告静音,但不会使其更有效地使用内存,仅在有任何处理时才有效。
设置dtype=unicode
不会做任何事情,因为对于numpy,a unicode
表示为object
。
转换器的使用
@sparrow正确指出了转换器的用法,以避免在遇到'foobar'
指定为的列时遇到大熊猫int
。我想补充一点,转换器在熊猫中使用时确实很笨重且效率低下,应该作为最后的手段使用。这是因为read_csv进程是单个进程。
CSV文件可以逐行处理,因此可以通过简单地将文件切成段并运行多个进程来由多个转换器并行更有效地进行处理,而这是熊猫所不支持的。但这是一个不同的故事。
回答 1
尝试:
dashboard_df = pd.read_csv(p_file, sep=',', error_bad_lines=False, index_col=False, dtype='unicode')
根据熊猫文件:
dtype:类型名称或列的字典->类型
至于low_memory,默认情况下为True ,尚未记录。我认为这无关紧要。该错误消息是通用的,因此无论如何您都无需弄混low_memory。希望这会有所帮助,如果您还有其他问题,请告诉我
回答 2
df = pd.read_csv('somefile.csv', low_memory=False)
这应该可以解决问题。从CSV读取180万行时,出现了完全相同的错误。
回答 3
如firelynx先前所述,如果显式指定了dtype并且存在与该dtype不兼容的混合数据,则加载将崩溃。我使用像这样的转换器作为变通方法来更改具有不兼容数据类型的值,以便仍然可以加载数据。
def conv(val):
if not val:
return 0
try:
return np.float64(val)
except:
return np.float64(0)
df = pd.read_csv(csv_file,converters={'COL_A':conv,'COL_B':conv})
回答 4
我有一个约400MB的文件类似的问题。设置low_memory=False
对我有用。首先做一些简单的事情,我将检查您的数据帧不大于系统内存,重新启动,清除RAM,然后再继续。如果您仍然遇到错误,则值得确保您的.csv
文件正常,请在Excel中快速查看并确保没有明显的损坏。原始数据损坏可能会给企业造成严重破坏。
回答 5
处理巨大的csv文件(600万行)时,我遇到了类似的问题。我遇到了三个问题:1.文件包含奇怪的字符(使用编码修复)2.未指定数据类型(使用dtype属性修复)3.使用上述方法,我仍然面临与file_format相关的问题,即根据文件名定义(使用try ..固定,..除外)
df = pd.read_csv(csv_file,sep=';', encoding = 'ISO-8859-1',
names=['permission','owner_name','group_name','size','ctime','mtime','atime','filename','full_filename'],
dtype={'permission':str,'owner_name':str,'group_name':str,'size':str,'ctime':object,'mtime':object,'atime':object,'filename':str,'full_filename':str,'first_date':object,'last_date':object})
try:
df['file_format'] = [Path(f).suffix[1:] for f in df.filename.tolist()]
except:
df['file_format'] = ''
回答 6
它在low_memory = False
导入DataFrame时对我有用。这就是对我有用的所有更改:
df = pd.read_csv('export4_16.csv',low_memory=False)