为了账号安全,请及时绑定邮箱和手机立即绑定

Pandas read_csv low_memory和dtype选项

/ 猿问

Pandas read_csv low_memory和dtype选项

函数式编程 2019-08-23 16:39:22

Pandas 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。

为什么该dtype选项与此相关low_memory,以及为什么会False帮助解决此问题?


查看完整描述

3 回答

?
潇湘沐

已弃用的low_memory选项

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

你得到这个low_memory警告的原因是因为猜测每列的dtypes是非常需要内存的。Pandas试图通过分析每列中的数据来确定要设置的dtype。

Dtype猜测(非常糟糕)

Pandas只能确定读取整个文件后列应该具有什么类型。这意味着在读取整个文件之前无法真正解析任何内容,除非您在读取最后一个值时不得不更改该列的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,username
1,Alice
3,Bob
foobar,Caesar"""sio = StringIO(csvdata)pd.read_csv(sio, dtype={"user_id": int, "username": object})ValueError: invalid literal for long() with base 10: 'foobar'

dtypes通常是一个numpy事情,在这里阅读更多关于它们:http://docs.scipy.org/doc/numpy/reference/generated/numpy.dtype.html

什么dtypes存在?

这些是大熊猫也接受的numpy dtypes

[numpy.generic,
 [[numpy.number,
   [[numpy.integer,
     [[numpy.signedinteger,
       [numpy.int8,
        numpy.int16,
        numpy.int32,
        numpy.int64,
        numpy.int64,
        numpy.timedelta64]],
      [numpy.unsignedinteger,
       [numpy.uint8,
        numpy.uint16,
        numpy.uint32,
        numpy.uint64,
        numpy.uint64]]]],
    [numpy.inexact,
     [[numpy.floating,
       [numpy.float16, numpy.float32, numpy.float64, numpy.float128]],
      [numpy.complexfloating,
       [numpy.complex64, numpy.complex128, numpy.complex256]]]]]],
  [numpy.flexible,
   [[numpy.character, [numpy.bytes_, numpy.str_]],
    [numpy.void, [numpy.record]]]],
  numpy.bool_,
  numpy.datetime64,
  numpy.object_]]

熊猫还添加了两个dtypes:categorical并且datetime64[ns, tz]在numpy中不可用

熊猫dtype参考

陷阱,警告,笔记

设置dtype=object将使上述警告静音,但不会使内存效率更高,只有处理有效。

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

使用转换器

@sparrow正确地指出转换器的使用,以避免'foobar'在指定的列中遇到大熊猫时炸毁int。我想补充一点,转换器在pandas中使用非常繁重且效率低,应该作为最后的手段使用。这是因为read_csv进程是一个进程。

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


查看完整回答
反对 回复 2019-08-23
?
DIEA

low_memory = False导入DataFrame时,它对我有用。这就是对我有用的所有变化:

df = pd.read_csv('export4_16.csv',low_memory=False)


查看完整回答
反对 回复 2019-08-23
?
慕田峪4524236

我有一个约400MB文件的类似问题。设置low_memory=False为我做了诀窍。首先做一些简单的事情,我会检查你的数据帧是否不比你的系统内存大,重新启动,在继续之前清除RAM。如果您仍然遇到错误,那么值得确保您的.csv文件正常,请快速查看Excel并确保没有明显的损坏。破碎的原始数据可能会造成严重破坏......


查看完整回答
反对 回复 2019-08-23

添加回答

回复

举报

0/150
提交
取消
意见反馈 邀请有奖 帮助中心 APP下载
官方微信